ngx-rendering-service-lib 0.0.66873 → 0.0.66875

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.
@@ -6,7 +6,7 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
6
6
  import { EduSharingApiModule } from 'ngx-edu-sharing-api';
7
7
  import { MatProgressBarModule } from '@angular/material/progress-bar';
8
8
  import { filter } from 'rxjs/operators';
9
- import { TranslateService } from '@ngx-translate/core';
9
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
10
10
  import { EduSharingUiCommonModule } from 'ngx-edu-sharing-ui';
11
11
  import { RENDERING_SERVICE_LIB_CONFIG } from '../rendering-service-lib-configuration';
12
12
  import { MatButtonModule } from '@angular/material/button';
@@ -20,7 +20,8 @@ import * as i4 from "@angular/material/progress-spinner";
20
20
  import * as i5 from "@angular/material/progress-bar";
21
21
  import * as i6 from "@angular/material/button";
22
22
  import * as i7 from "ngx-edu-sharing-ui";
23
- import * as i8 from "../rendering-service-lib-configuration";
23
+ import * as i8 from "@ngx-translate/core";
24
+ import * as i9 from "../rendering-service-lib-configuration";
24
25
  export class RenderComponent {
25
26
  constructor(renderControllerService, jobInfoControllerService, moduleInfoService, platformLocation, configuration) {
26
27
  this.renderControllerService = renderControllerService;
@@ -31,6 +32,7 @@ export class RenderComponent {
31
32
  this.displayMode = 'full';
32
33
  this.activateServiceWorker = true;
33
34
  this.assetUrl = '';
35
+ this.resourceUrl = '';
34
36
  this.serviceWorkerReady = false;
35
37
  this.loadData = new Subject();
36
38
  this.renderData$ = new BehaviorSubject(null);
@@ -241,10 +243,24 @@ export class RenderComponent {
241
243
  progress: progress
242
244
  });
243
245
  }
246
+ getAuthors() {
247
+ console.info("Getting authors");
248
+ if (this.node?.properties !== undefined) {
249
+ console.info("Props != undefined");
250
+ const freeText = (this.node.properties['ccm:author_freetext'] ?? []).join(', ').trim();
251
+ console.info("FREETEXT: " + freeText);
252
+ const authors = (this.node.properties['ccm:lifecyclecontributer_authorFN'] ?? []).join(', ').trim();
253
+ console.info("AUTHORS: " + authors);
254
+ const orgs = (this.node.properties['ccm:lifecyclecontributer_authorVCARD_ORG'] ?? []).join(', ').trim();
255
+ console.info("ORGS: " + orgs);
256
+ return authors + (orgs ? ', ' + orgs : '') + (freeText ? ', ' + freeText : '');
257
+ }
258
+ return "";
259
+ }
244
260
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderComponent, deps: [{ token: i1.RenderControllerWrapperService }, { token: i1.JobInfoControllerService }, { token: i2.ModuleInfoService }, { token: i3.PlatformLocation }, { token: RENDERING_SERVICE_LIB_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
245
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.6", type: RenderComponent, isStandalone: true, selector: "rs-root", inputs: { displayMode: "displayMode", request: "request", node: "node", serviceWorkerUrl: "serviceWorkerUrl", activateServiceWorker: "activateServiceWorker", assetUrl: "assetUrl" }, providers: [
261
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.6", type: RenderComponent, isStandalone: true, selector: "rs-root", inputs: { displayMode: "displayMode", request: "request", node: "node", serviceWorkerUrl: "serviceWorkerUrl", activateServiceWorker: "activateServiceWorker", assetUrl: "assetUrl", resourceUrl: "resourceUrl" }, providers: [
246
262
  TranslateService
247
- ], usesOnChanges: true, ngImport: i0, template: "<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\n </ng-container>\n <div class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>TODO INLINE</div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\n </div>\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}.module{overflow:auto;display:flex;flex-direction:column;gap:5px;flex-grow:1;height:auto}.module .inline-metadata{display:flex;align-items:center;gap:5px;background-color:#f8f8f8;padding:5px 20px}.module .inline-metadata>div:first-child{flex-grow:1}.module .progress{display:flex;justify-content:center;flex-grow:1}.inline-metadata-panel{box-shadow:0 3px 3px #0000001a;width:100%;height:100%;overflow-y:auto;display:flex;justify-content:center;align-items:center;background-color:#f8f8f8;padding:10px}.inline-metadata-panel>es-mds-viewer ::ng-deep .mds-viewer{width:260px}\n"], dependencies: [{ kind: "ngmodule", type: RenderingApiModule }, { kind: "ngmodule", type: RenderingModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: EduSharingApiModule }, { kind: "ngmodule", type: EduSharingUiCommonModule }, { kind: "component", type: i7.MdsViewerComponent, selector: "es-mds-viewer", inputs: ["mdsEditorInstanceService", "groupId", "setId", "data", "showGroupHeadings", "headingLevel"] }, { kind: "directive", type: i7.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], 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/audio/audio.component").then(m => m.AudioComponent)], () => [import("./module/binder/binder.component").then(m => m.BinderComponent)], () => [import("./module/ddb/ddb.component").then(m => m.DdbComponent)], () => [import("./module/default/default.component").then(m => m.DefaultComponent)], () => [import("./module/url/url.component").then(m => m.UrlComponent)], () => [import("./module/error/error.component").then(m => m.ErrorComponent)]] }); }
263
+ ], usesOnChanges: true, ngImport: i0, template: "<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\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 class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>\n <a [href]=\"resourceUrl\">{{ node.title || node.name }}</a> {{ 'RENDERING.AUTHORED_BY' | translate }} {{getAuthors()}}\n <ng-container *ngIf=\"node.license as license\">\n <ng-container *ngIf=\"license.url; else noLink\">\n <a [href]=\"license.url\" target=\"_blank\" rel=\"noopener\">\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </a>\n </ng-container>\n <ng-template #noLink>\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </ng-template>\n </ng-container>\n </div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\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}.module{overflow:auto;display:flex;flex-direction:column;gap:5px;flex-grow:1;height:auto}.module .inline-metadata{display:flex;align-items:center;gap:5px;background-color:#f8f8f8;padding:5px 20px}.module .inline-metadata>div:first-child{flex-grow:1}.module .progress{display:flex;justify-content:center;flex-grow:1}.inline-metadata-panel{box-shadow:0 3px 3px #0000001a;width:100%;height:100%;overflow-y:auto;display:flex;justify-content:center;align-items:center;background-color:#f8f8f8;padding:10px}.inline-metadata-panel>es-mds-viewer ::ng-deep .mds-viewer{width:260px}\n"], dependencies: [{ kind: "ngmodule", type: RenderingApiModule }, { kind: "ngmodule", type: RenderingModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: EduSharingApiModule }, { kind: "ngmodule", type: EduSharingUiCommonModule }, { kind: "component", type: i7.MdsViewerComponent, selector: "es-mds-viewer", inputs: ["mdsEditorInstanceService", "groupId", "setId", "data", "showGroupHeadings", "headingLevel"] }, { kind: "directive", type: i7.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }], 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/audio/audio.component").then(m => m.AudioComponent)], () => [import("./module/binder/binder.component").then(m => m.BinderComponent)], () => [import("./module/ddb/ddb.component").then(m => m.DdbComponent)], () => [import("./module/default/default.component").then(m => m.DefaultComponent)], () => [import("./module/url/url.component").then(m => m.UrlComponent)], () => [import("./module/error/error.component").then(m => m.ErrorComponent)]] }); }
248
264
  }
249
265
  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/audio/audio.component").then(m => m.AudioComponent), import("./module/binder/binder.component").then(m => m.BinderComponent), import("./module/ddb/ddb.component").then(m => m.DdbComponent), import("./module/default/default.component").then(m => m.DefaultComponent), import("./module/url/url.component").then(m => m.UrlComponent), import("./module/error/error.component").then(m => m.ErrorComponent)], resolveMetadata: (ImageComponent, VideoComponent, PdfComponent, EduHtmlComponent, AudioComponent, BinderComponent, DdbComponent, DefaultComponent, UrlComponent, ErrorComponent) => ({ decorators: [{
250
266
  type: Component,
@@ -269,10 +285,11 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.6", ng
269
285
  ErrorComponent,
270
286
  CdkConnectedOverlay,
271
287
  CdkOverlayOrigin,
288
+ TranslateModule,
272
289
  ], providers: [
273
290
  TranslateService
274
- ], template: "<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\n </ng-container>\n <div class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>TODO INLINE</div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\n </div>\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}.module{overflow:auto;display:flex;flex-direction:column;gap:5px;flex-grow:1;height:auto}.module .inline-metadata{display:flex;align-items:center;gap:5px;background-color:#f8f8f8;padding:5px 20px}.module .inline-metadata>div:first-child{flex-grow:1}.module .progress{display:flex;justify-content:center;flex-grow:1}.inline-metadata-panel{box-shadow:0 3px 3px #0000001a;width:100%;height:100%;overflow-y:auto;display:flex;justify-content:center;align-items:center;background-color:#f8f8f8;padding:10px}.inline-metadata-panel>es-mds-viewer ::ng-deep .mds-viewer{width:260px}\n"] }]
275
- }], ctorParameters: () => [{ type: i1.RenderControllerWrapperService }, { type: i1.JobInfoControllerService }, { type: i2.ModuleInfoService }, { type: i3.PlatformLocation }, { type: i8.RenderingServiceLibConfiguration, decorators: [{
291
+ ], template: "<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\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 class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>\n <a [href]=\"resourceUrl\">{{ node.title || node.name }}</a> {{ 'RENDERING.AUTHORED_BY' | translate }} {{getAuthors()}}\n <ng-container *ngIf=\"node.license as license\">\n <ng-container *ngIf=\"license.url; else noLink\">\n <a [href]=\"license.url\" target=\"_blank\" rel=\"noopener\">\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </a>\n </ng-container>\n <ng-template #noLink>\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </ng-template>\n </ng-container>\n </div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\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}.module{overflow:auto;display:flex;flex-direction:column;gap:5px;flex-grow:1;height:auto}.module .inline-metadata{display:flex;align-items:center;gap:5px;background-color:#f8f8f8;padding:5px 20px}.module .inline-metadata>div:first-child{flex-grow:1}.module .progress{display:flex;justify-content:center;flex-grow:1}.inline-metadata-panel{box-shadow:0 3px 3px #0000001a;width:100%;height:100%;overflow-y:auto;display:flex;justify-content:center;align-items:center;background-color:#f8f8f8;padding:10px}.inline-metadata-panel>es-mds-viewer ::ng-deep .mds-viewer{width:260px}\n"] }]
292
+ }], ctorParameters: () => [{ type: i1.RenderControllerWrapperService }, { type: i1.JobInfoControllerService }, { type: i2.ModuleInfoService }, { type: i3.PlatformLocation }, { type: i9.RenderingServiceLibConfiguration, decorators: [{
276
293
  type: Optional
277
294
  }, {
278
295
  type: Inject,
@@ -289,5 +306,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.6", ng
289
306
  type: Input
290
307
  }], assetUrl: [{
291
308
  type: Input
309
+ }], resourceUrl: [{
310
+ type: Input
292
311
  }] } }) });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFRbkQsT0FBTyxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU1RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUMsbUJBQW1CLEVBQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQU1wRSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFPdEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLHdCQUF3QixFQUFxQixNQUFNLG9CQUFvQixDQUFDO0FBRWhGLE9BQU8sRUFBQyw0QkFBNEIsRUFBbUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0SCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLE9BQU8sRUFBZ0IsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7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QUF3Qjs0QkFDeEIsb0JBQW9COzRCQUNwQixPQUFPOzRCQUNQLFlBQVk7NEJBQ1osWUFBWTs0QkFDWixnQkFBZ0I7NEJBQ2hCLGdCQUFnQjs0QkFDaEIsZUFBZTs0QkFDZixjQUFjOzRCQUNkLGVBQWU7NEJBQ2YsWUFBWTs0QkFDWixtQkFBbUI7NEJBQ25CLHdCQUF3Qjs0QkFDeEIsY0FBYzs0QkFDZCxtQkFBbUI7NEJBQ25CLGdCQUFnQjt5QkFDakIsYUFDVTs0QkFDVCxnQkFBZ0I7eUJBQ2pCOzs4QkF3QkUsUUFBUTs7OEJBQUksTUFBTTsrQkFBQyw0QkFBNEI7NkNBbkJ6QyxXQUFXOzBCQUFuQixLQUFLO29CQUNHLE9BQU87MEJBQWYsS0FBSztvQkFDRyxJQUFJOzBCQUFaLEtBQUs7b0JBQ0csZ0JBQWdCOzBCQUF4QixLQUFLO29CQUNHLHFCQUFxQjswQkFBN0IsS0FBSztvQkFDRyxRQUFROzBCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPcHRpb25hbCwgU2ltcGxlQ2hhbmdlc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JlbmRlcmluZ01vZHVsZX0gZnJvbSAnLi9yZW5kZXJpbmcubW9kdWxlJztcbmltcG9ydCB7XG4gIEpvYkluZm9Db250cm9sbGVyU2VydmljZSxcbiAgSm9iSW5mb1JlcGx5LFxuICBSZW5kZXJDb250cm9sbGVyV3JhcHBlclNlcnZpY2UsXG4gIFJlbmRlckRhdGFSZXF1ZXN0V2l0aFRva2VuLFxuICBSZW5kZXJEYXRhUmVzcG9uc2Vcbn0gZnJvbSAnbmd4LXJlbmRlcmluZy1zZXJ2aWNlLWFwaSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZGVib3VuY2VUaW1lLCBmaXJzdFZhbHVlRnJvbSwgaW50ZXJ2YWwsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzJztcbmltcG9ydCB7SW1hZ2VDb21wb25lbnR9IGZyb20gJy4vbW9kdWxlL2ltYWdlL2ltYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQge1JlbmRlcmluZ0FwaU1vZHVsZX0gZnJvbSAnLi9yZW5kZXJpbmctYXBpLm1vZHVsZSc7XG5pbXBvcnQge1ZpZGVvQ29tcG9uZW50fSBmcm9tICcuL21vZHVsZS92aWRlby92aWRlby5jb21wb25lbnQnO1xuaW1wb3J0IHtNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHtFZHVTaGFyaW5nQXBpTW9kdWxlLCBOb2RlfSBmcm9tICduZ3gtZWR1LXNoYXJpbmctYXBpJztcbmltcG9ydCB7TWF0UHJvZ3Jlc3NCYXJNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQge0Fzc2V0U3RhdGVJdGVtLCBSZW5kZXJEYXRhfSBmcm9tICcuL2R0by9SZW5kZXJEYXRhJztcbmltcG9ydCB7UGRmQ29tcG9uZW50fSBmcm9tICcuL21vZHVsZS9wZGYvcGRmLmNvbXBvbmVudCc7XG5pbXBvcnQge1VybENvbXBvbmVudH0gZnJvbSAnLi9tb2R1bGUvdXJsL3VybC5jb21wb25lbnQnO1xuaW1wb3J0IHtFZHVIdG1sQ29tcG9uZW50fSBmcm9tICcuL21vZHVsZS9lZHVodG1sL2VkdUh0bWwuY29tcG9uZW50JztcbmltcG9ydCB7TW9kdWxlSW5mb1NlcnZpY2V9IGZyb20gJy4uL21vZHVsZS1pbmZvLnNlcnZpY2UnO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7UGxhdGZvcm1Mb2NhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7RGVmYXVsdENvbXBvbmVudH0gZnJvbSAnLi9tb2R1bGUvZGVmYXVsdC9kZWZhdWx0LmNvbXBvbmVudCc7XG5pbXBvcnQge0Zyb250ZW5kTW9kdWxlQ29uZmlnfSBmcm9tICcuL2R0by9Gcm9udGVuZE1vZHVsZUNvbmZpZyc7XG5pbXBvcnQge0F1ZGlvQ29tcG9uZW50fSBmcm9tICcuL21vZHVsZS9hdWRpby9hdWRpby5jb21wb25lbnQnO1xuaW1wb3J0IHtCaW5kZXJDb21wb25lbnR9IGZyb20gJy4vbW9kdWxlL2JpbmRlci9iaW5kZXIuY29tcG9uZW50JztcbmltcG9ydCB7RGRiQ29tcG9uZW50fSBmcm9tICcuL21vZHVsZS9kZGIvZGRiLmNvbXBvbmVudCc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtFZHVTaGFyaW5nVWlDb21tb25Nb2R1bGUsIEVkdVNoYXJpbmdVaU1vZHVsZX0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLXVpJztcbmltcG9ydCB7RXJyb3JDb21wb25lbnR9IGZyb20gJy4vbW9kdWxlL2Vycm9yL2Vycm9yLmNvbXBvbmVudCc7XG5pbXBvcnQge1JFTkRFUklOR19TRVJWSUNFX0xJQl9DT05GSUcsIFJlbmRlcmluZ1NlcnZpY2VMaWJDb25maWd1cmF0aW9ufSBmcm9tICcuLi9yZW5kZXJpbmctc2VydmljZS1saWItY29uZmlndXJhdGlvbic7XG5pbXBvcnQge01hdEJ1dHRvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7TWF0SWNvbiwgTWF0SWNvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQge0Nka0Nvbm5lY3RlZE92ZXJsYXksIENka092ZXJsYXlPcmlnaW59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnMtcm9vdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZW5kZXJpbmdBcGlNb2R1bGUsXG4gICAgUmVuZGVyaW5nTW9kdWxlLFxuICAgIEltYWdlQ29tcG9uZW50LFxuICAgIFZpZGVvQ29tcG9uZW50LFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBNYXRJY29uLFxuICAgIFBkZkNvbXBvbmVudCxcbiAgICBVcmxDb21wb25lbnQsXG4gICAgRWR1SHRtbENvbXBvbmVudCxcbiAgICBEZWZhdWx0Q29tcG9uZW50LFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBBdWRpb0NvbXBvbmVudCxcbiAgICBCaW5kZXJDb21wb25lbnQsXG4gICAgRGRiQ29tcG9uZW50LFxuICAgIEVkdVNoYXJpbmdBcGlNb2R1bGUsXG4gICAgRWR1U2hhcmluZ1VpQ29tbW9uTW9kdWxlLFxuICAgIEVycm9yQ29tcG9uZW50LFxuICAgIENka0Nvbm5lY3RlZE92ZXJsYXksXG4gICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgVHJhbnNsYXRlU2VydmljZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVuZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3JlbmRlci5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgUmVuZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuICBASW5wdXQoKSBkaXNwbGF5TW9kZTogJ2Z1bGwnIHwgJ2lubGluZScgPSAnZnVsbCc7XG4gIEBJbnB1dCgpIHJlcXVlc3Q6IFJlbmRlckRhdGFSZXF1ZXN0V2l0aFRva2VuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBub2RlOiBOb2RlIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBzZXJ2aWNlV29ya2VyVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGFjdGl2YXRlU2VydmljZVdvcmtlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFzc2V0VXJsOiBzdHJpbmcgPSAnJztcbiAgc2VydmljZVdvcmtlclJlYWR5ID0gZmFsc2U7XG4gIGxvYWREYXRhID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcmVuZGVyRGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlbmRlckRhdGEgfCBudWxsPihudWxsKTtcbiAgZmluaXNoZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBzb21lQnV0Tm90QWxsRmluaXNoZWQgPSBuZXcgU3ViamVjdDxCb29sZWFuPigpXG4gIHByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBtb2R1bGU6IHN0cmluZywgcHJvZ3Jlc3M/OiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuICBzaG93SW5saW5lTWV0YWRhdGE6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlckNvbnRyb2xsZXJTZXJ2aWNlOiBSZW5kZXJDb250cm9sbGVyV3JhcHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBqb2JJbmZvQ29udHJvbGxlclNlcnZpY2U6IEpvYkluZm9Db250cm9sbGVyU2VydmljZSxcbiAgICBwcml2YXRlIG1vZHVsZUluZm9TZXJ2aWNlOiBNb2R1bGVJbmZvU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtTG9jYXRpb246IFBsYXRmb3JtTG9jYXRpb24sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSRU5ERVJJTkdfU0VSVklDRV9MSUJfQ09ORklHKSBwdWJsaWMgY29uZmlndXJhdGlvbjogUmVuZGVyaW5nU2VydmljZUxpYkNvbmZpZ3VyYXRpb24sXG4gICkge1xuICAgIHRoaXMubG9hZERhdGEucGlwZShcbiAgICAgIGZpbHRlcigoKSA9PiB0aGlzLm5vZGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNlcnZpY2VXb3JrZXJSZWFkeSksXG4gICAgICBkZWJvdW5jZVRpbWUoMTApLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgLy8gc3Vic2NyaWJlIGVycm9yIGhhbmRsaW5nXG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrTW9kdWxlKClcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogYXN5bmMgKGZyb250ZW5kTW9kdWxlKSA9PiB7XG4gICAgICAgIC8vIE5vIGZ1cnRoZXIgY2FsbHMgdG8gcnMyIG5lY2Vzc2FyeSBpZiB3ZSBoYXZlIGEgZnJvbnRlbmQgb25seSBtb2R1bGVcbiAgICAgICAgaWYgKGZyb250ZW5kTW9kdWxlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZGF0YTogUmVuZGVyRGF0YSA9IHtcbiAgICAgICAgICAgIG1vZHVsZTogZnJvbnRlbmRNb2R1bGUubW9kdWxlLFxuICAgICAgICAgICAgZnJvbnRlbmRNb2R1bGVDb25maWc6IGZyb250ZW5kTW9kdWxlXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVuZGVyRGF0YSQubmV4dChkYXRhKVxuICAgICAgICAgIHRoaXMuZmluaXNoZWQubmV4dCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlclJlc3BvbnNlRGF0YSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMucmVuZGVyQ29udHJvbGxlclNlcnZpY2UuZ2V0UmVuZGVyRGF0YVRva2VuKHRoaXMucmVxdWVzdCEhKSlcbiAgICAgICAgICAgIC8vIENhc2UgMTogbm8gam9iIHJldHVybmVkID0+IG5vIHBvbGxpbmcgbmVlZGVkXG4gICAgICAgICAgICBpZiAocmVuZGVyUmVzcG9uc2VEYXRhLmpvYklkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVuZGVyaW5nUmVzcG9uc2VXaXRob3V0Sm9iKHJlbmRlclJlc3BvbnNlRGF0YSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MkLm5leHQoe21vZHVsZTogcmVuZGVyUmVzcG9uc2VEYXRhLm1vZHVsZSA/PyAnJ30pO1xuICAgICAgICAgICAgICBpbnRlcnZhbCg1MDApLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZmluaXNoZWQpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmpvYkluZm9Db250cm9sbGVyU2VydmljZS5nZXRKb2JJbmZvKHtqb2JJZDogcmVuZGVyUmVzcG9uc2VEYXRhLmpvYklkISF9KS5waXBlKCkpLFxuICAgICAgICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogYXN5bmMgKGpvYkluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFNvbWUsIGJ1dCBub3QgYWxsLCBqb2JzIGFyZSBpbiBhIGZpbmFsIHN0YXR1cyAodGhpcyBtZWFucyBzb21lIGFyZSBzdGlsbCBRVUVVRUQgb3IgUFJPQ0VTU0lORylcbiAgICAgICAgICAgICAgICAgIGlmIChqb2JJbmZvLmpvYnMuc29tZShqID0+IGouc3RhdHVzID09PSAnRklOSVNIRUQnKSAmJiBqb2JJbmZvLnN0YXR1cyAhPT0gJ0ZJTklTSEVEJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUpvYkluZm9XaXRoU3ViSm9ic0luUHJvZ3Jlc3MocmVuZGVyUmVzcG9uc2VEYXRhLCBqb2JJbmZvKVxuICAgICAgICAgICAgICAgICAgICAvLyBtYWluIGpvYiBmaW5pc2hlZCBvciBwYXJ0aWFsbHkgZmFpbGVkXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpvYkluZm8uc3RhdHVzID09PSAnRklOSVNIRUQnIHx8IGpvYkluZm8uc3RhdHVzID09PSAnUEFSVElBTExZX0ZBSUxFRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGaW5pc2hlZE9yUGFydGlhbEpvYkluZm8ocmVuZGVyUmVzcG9uc2VEYXRhLCBqb2JJbmZvKVxuICAgICAgICAgICAgICAgICAgICAvLyBNYWluIGpvYiBmYWlsZWQgPT4gbm8gbW9kdWxlIGJ1dCBlcnJvciBwYWdlXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpvYkluZm8uc3RhdHVzID09PSAnRkFJTEVEJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUZhaWxlZE1haW5Kb2Ioam9iSW5mbylcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vIGZpbmlzaGVkIGpvYnMgLT4gc2hvdyBlaXRoZXIgb25lIHByb2dyZXNzIGJhciB3aXRoIHJhY2UgbGVhZGVyIChwcm9ncmVzcyAwLTEwMClcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgcXVldWUgcG9zaXRpb24gKHByb2dyZXNzICgtaW5mLC0xXSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVNYWluSm9iV2l0aE5vU3ViSm9iSW5GaW5hbFN0YXR1cyhqb2JJbmZvKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQXBpRXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFwaUVycm9yKGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVBcGlFcnJvcihlcnJvcilcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUFwaUVycm9yKGVycm9yOiBhbnkpIHtcbiAgICBjb25zdCBwdWJsaWNNZXNzYWdlID0gZXJyb3IuZXJyb3IudXNlck1lc3NhZ2UgPz8gJ0dFTkVSSUNfRVJST1JfTUVTU0FHRSdcbiAgICBjb25zdCBkYXRhOiBSZW5kZXJEYXRhID0ge1xuICAgICAgbW9kdWxlOiAnRVJST1InLFxuICAgICAgcHVibGljRXJyb3JNZXNzYWdlOiBwdWJsaWNNZXNzYWdlXG4gICAgfVxuICAgIHRoaXMucmVuZGVyRGF0YSQubmV4dChkYXRhKVxuICAgIHRoaXMuZmluaXNoZWQubmV4dCgpXG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5hc3NldFVybCAhPT0gJycpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hc3NldHNVcmwgPSB0aGlzLmFzc2V0VXJsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYWN0aXZhdGVTZXJ2aWNlV29ya2VyKSB7XG4gICAgICB0aGlzLnNlcnZpY2VXb3JrZXJSZWFkeSA9IHRydWU7XG4gICAgICB0aGlzLmxvYWREYXRhLm5leHQoKTtcbiAgICB9XG4gICAgLy8gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy50cmFuc2xhdGlvbnNTZXJ2aWNlLmluaXRpYWxpemUoKSlcbiAgICBpZiAoJ3NlcnZpY2VXb3JrZXInIGluIG5hdmlnYXRvcikge1xuICAgICAgY29uc3QgcmVnID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuZ2V0UmVnaXN0cmF0aW9ucygpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVnPy5tYXAoKHI6IFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24pID0+IHIudW5yZWdpc3RlcigpKSk7XG4gICAgICBjb25zdCBzZXJ2aWNlV29ya2VyVXJsID0gdGhpcy5zZXJ2aWNlV29ya2VyVXJsID8/ICh0aGlzLnBsYXRmb3JtTG9jYXRpb24uZ2V0QmFzZUhyZWZGcm9tRE9NKCkgKyAnZWR1LXNlcnZpY2Utd29ya2VyLmpzJyk7XG4gICAgICBjb25zdCBzY29wZSA9IHRoaXMuc2VydmljZVdvcmtlclVybCA/ICcvJyA6IHRoaXMucGxhdGZvcm1Mb2NhdGlvbi5nZXRCYXNlSHJlZkZyb21ET00oKTtcbiAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKHNlcnZpY2VXb3JrZXJVcmwsIHtcbiAgICAgICAgc2NvcGU6IHNjb3BlXG4gICAgICB9KTtcbiAgICAgIGlmIChyZWdpc3RyYXRpb24ud2FpdGluZykge1xuICAgICAgICByZWdpc3RyYXRpb24ud2FpdGluZy5wb3N0TWVzc2FnZSh7dHlwZTogJ1NLSVBfV0FJVElORyd9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VydmljZVdvcmtlclJlYWR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZERhdGEubmV4dCgpO1xuICAgICAgcmVnaXN0cmF0aW9uLm9udXBkYXRlZm91bmQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IHJlZ2lzdHJhdGlvbi5pbnN0YWxsaW5nO1xuICAgICAgICBpZiAobmV3V29ya2VyKSB7XG4gICAgICAgICAgbmV3V29ya2VyLm9uc3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAobmV3V29ya2VyLnN0YXRlID09PSAnaW5zdGFsbGVkJykge1xuICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIG5ld1dvcmtlci5wb3N0TWVzc2FnZSh7dHlwZTogJ1NLSVBfV0FJVElORyd9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdjb250cm9sbGVyY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmluZm8oJ1NlcnZpY2UgV29ya2VyIGNvbnRyb2xsaW5nIHRoaXMgcGFnZS4nKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2VydmljZSB3b3JrZXIgQVBJIG5vdCBhdmFpbGFibGUnKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhfOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5sb2FkRGF0YS5uZXh0KCk7XG4gIH1cblxuICBhc3luYyBjaGVja01vZHVsZSgpOiBQcm9taXNlPEZyb250ZW5kTW9kdWxlQ29uZmlnIHwgbnVsbD4ge1xuICAgIGlmICghYXdhaXQgdGhpcy5tb2R1bGVJbmZvU2VydmljZS5pc0F2YWlsYWJsZUJhY2tlbmRPYmplY3QodGhpcy5ub2RlKSkge1xuICAgICAgaWYgKHRoaXMubm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZUluZm9TZXJ2aWNlLmdldEZyb250ZW5kTW9kdWxlU2V0dGluZyh0aGlzLm5vZGUpXG4gICAgICB9XG4gICAgICByZXR1cm4ge21vZHVsZTogJ2RlZmF1bHQnLCB1cmxNb2R1bGVDb25maWc6IG51bGx9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUmVuZGVyaW5nUmVzcG9uc2VXaXRob3V0Sm9iKHJlbmRlckRhdGFSZXNwb25zZTogUmVuZGVyRGF0YVJlc3BvbnNlKSB7XG4gICAgY29uc3QgaXRlbXMgPSByZW5kZXJEYXRhUmVzcG9uc2Uub2JqZWN0TGlua3M/Lm1hcChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGFzc2V0SXRlbTogQXNzZXRTdGF0ZUl0ZW0gPSB7XG4gICAgICAgIGxpbms6IGl0ZW0ubGluayxcbiAgICAgICAgcHJvZ3Jlc3M6IDEwMCxcbiAgICAgICAgaGVpZ2h0OiBpdGVtLmhlaWdodCxcbiAgICAgICAgd2lkdGg6IGl0ZW0ud2lkdGgsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogJ0ZJTklTSEVEJ1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFzc2V0SXRlbVxuICAgIH0pXG4gICAgY29uc3QgZGF0YTogUmVuZGVyRGF0YSA9IHtcbiAgICAgIG1vZHVsZTogcmVuZGVyRGF0YVJlc3BvbnNlLm1vZHVsZSA/PyAnJyxcbiAgICAgIGl0ZW1zOiBpdGVtc1xuICAgIH1cbiAgICByZW5kZXJEYXRhUmVzcG9uc2Uub2JqZWN0TGlua3MgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJlbmRlckRhdGEkLm5leHQoZGF0YSk7XG4gICAgdGhpcy5maW5pc2hlZC5uZXh0KCk7XG4gIH1cblxuICBoYW5kbGVKb2JJbmZvV2l0aFN1YkpvYnNJblByb2dyZXNzKHJlbmRlckRhdGFSZXNwb25zZTogUmVuZGVyRGF0YVJlc3BvbnNlLCBqb2JJbmZvOiBKb2JJbmZvUmVwbHkpIHtcbiAgICBjb25zdCBpdGVtcyA9IGpvYkluZm8uam9icy5tYXAoc3ViSm9iID0+IHtcbiAgICAgIGNvbnN0IGFzc2V0SXRlbTogQXNzZXRTdGF0ZUl0ZW0gPSB7XG4gICAgICAgIGxpbms6IHN1YkpvYi5vYmplY3RMaW5rPy5saW5rID8/ICcnLFxuICAgICAgICBwcm9ncmVzczogc3ViSm9iLnN0YXR1cyAhPT0gJ1FVRVVFRCcgPyBzdWJKb2IucHJvZ3Jlc3MgOiAtKHN1YkpvYi5wcm9ncmVzcyArIDEpLFxuICAgICAgICBoZWlnaHQ6IHN1YkpvYi5vYmplY3RMaW5rPy5oZWlnaHQgPz8gc3ViSm9iLnF1YWxpdHksXG4gICAgICAgIHdpZHRoOiBzdWJKb2Iub2JqZWN0TGluaz8ud2lkdGggPz8gMCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHN1YkpvYi5hZGRpdGlvbmFsRGF0YSxcbiAgICAgICAgc3RhdHVzOiBzdWJKb2Iuc3RhdHVzLFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzc2V0SXRlbVxuICAgIH0pXG4gICAgY29uc3QgZGF0YTogUmVuZGVyRGF0YSA9IHtcbiAgICAgIG1vZHVsZTogcmVuZGVyRGF0YVJlc3BvbnNlLm1vZHVsZSA/PyAnJyxcbiAgICAgIGl0ZW1zOiBpdGVtc1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckRhdGEkLm5leHQoZGF0YSlcbiAgICB0aGlzLnNvbWVCdXROb3RBbGxGaW5pc2hlZC5uZXh0KHRydWUpXG4gIH1cblxuICBoYW5kbGVGaW5pc2hlZE9yUGFydGlhbEpvYkluZm8ocmVuZGVyRGF0YVJlc3BvbnNlOiBSZW5kZXJEYXRhUmVzcG9uc2UsIGpvYkluZm86IEpvYkluZm9SZXBseSkge1xuICAgIGNvbnN0IGl0ZW1zID0gam9iSW5mby5qb2JzLm1hcChzdWJKb2IgPT4ge1xuICAgICAgY29uc3QgYXNzZXRJdGVtOiBBc3NldFN0YXRlSXRlbSA9IHtcbiAgICAgICAgbGluazogc3ViSm9iLm9iamVjdExpbms/LmxpbmsgPz8gJycsXG4gICAgICAgIHByb2dyZXNzOiBzdWJKb2IucHJvZ3Jlc3MsXG4gICAgICAgIGhlaWdodDogc3ViSm9iLm9iamVjdExpbms/LmhlaWdodCA/PyBzdWJKb2IucXVhbGl0eSxcbiAgICAgICAgd2lkdGg6IHN1YkpvYi5vYmplY3RMaW5rPy53aWR0aCA/PyAwLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogc3ViSm9iLmFkZGl0aW9uYWxEYXRhLFxuICAgICAgICBwdWJsaWNFcnJvck1lc3NhZ2U6IHN1YkpvYi5wdWJsaWNFcnJvck1lc3NhZ2UsXG4gICAgICAgIHN0YXR1czpzdWJKb2Iuc3RhdHVzLFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzc2V0SXRlbVxuICAgIH0pXG4gICAgY29uc3QgZGF0YTogUmVuZGVyRGF0YSA9IHtcbiAgICAgIG1vZHVsZTogcmVuZGVyRGF0YVJlc3BvbnNlLm1vZHVsZSA/PyAnJyxcbiAgICAgIGl0ZW1zOiBpdGVtc1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckRhdGEkLm5leHQoZGF0YSlcbiAgICB0aGlzLmZpbmlzaGVkLm5leHQoKVxuICB9XG5cbiAgaGFuZGxlRmFpbGVkTWFpbkpvYihqb2JJbmZvOiBKb2JJbmZvUmVwbHkpIHtcbiAgICBjb25zdCBkYXRhOiBSZW5kZXJEYXRhID0ge1xuICAgICAgbW9kdWxlOiAnRVJST1InLFxuICAgICAgcHVibGljRXJyb3JNZXNzYWdlOiBqb2JJbmZvLnVzZXJNZXNzYWdlID8/ICdHRU5FUklDX0VSUk9SX01FU1NBR0UnXG4gICAgfVxuICAgIHRoaXMucmVuZGVyRGF0YSQubmV4dChkYXRhKVxuICAgIHRoaXMuZmluaXNoZWQubmV4dCgpXG4gIH1cblxuICBoYW5kbGVNYWluSm9iV2l0aE5vU3ViSm9iSW5GaW5hbFN0YXR1cyhqb2JJbmZvOiBKb2JJbmZvUmVwbHkpIHtcbiAgICBsZXQgcHJvZ3Jlc3MgPSAwXG4gICAgaWYgKGpvYkluZm8uam9icy5zb21lKGogPT4gai5zdGF0dXMgPT09ICdQUk9DRVNTSU5HJykpIHtcbiAgICAgIHByb2dyZXNzID0gTWF0aC5tYXgoLi4uam9iSW5mby5qb2JzLm1hcChqID0+IGoucHJvZ3Jlc3MpKVxuICAgIH0gZWxzZSBpZiAoam9iSW5mby5qb2JzLnNvbWUoaiA9PiBqLnN0YXR1cyA9PT0gJ1FVRVVFRCcpKSB7XG4gICAgICBwcm9ncmVzcyA9IC0oTWF0aC5taW4oLi4uam9iSW5mby5qb2JzLm1hcChqID0+IGoucHJvZ3Jlc3MgKyAxKSkpXG4gICAgfVxuICAgIHRoaXMucHJvZ3Jlc3MkLm5leHQoe1xuICAgICAgbW9kdWxlOiBqb2JJbmZvLm1vZHVsZSA/PyAnJyxcbiAgICAgIHByb2dyZXNzOiBwcm9ncmVzc1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibW9kdWxlIG1vZHVsZS17eyhyZW5kZXJEYXRhJCB8IGFzeW5jKT8ubW9kdWxlfX1cIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlbmRlckRhdGEkIHwgYXN5bmMgYXMgZGF0YVwiPlxuICAgIEBkZWZlciAod2hlbiBkYXRhPy5tb2R1bGUgPT09ICdJTUFHRScpe1xuICAgICAgPHJzLW1vZHVsZS1pbWFnZSBbZGF0YV09XCJkYXRhXCIgW25vZGVdPVwibm9kZVwiPjwvcnMtbW9kdWxlLWltYWdlPlxuICAgIH0gQGxvYWRpbmcge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgQGRlZmVyICh3aGVuIGRhdGE/Lm1vZHVsZSA9PT0gJ1ZJREVPJyl7XG4gICAgICA8cnMtbW9kdWxlLXZpZGVvIFtkYXRhXT1cImRhdGFcIiBbbm9kZV09XCJub2RlXCI+PC9ycy1tb2R1bGUtdmlkZW8+XG4gICAgfSBAbG9hZGluZyB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgICBAZGVmZXIgKHdoZW4gZGF0YT8ubW9kdWxlID09PSAnUERGJyB8fCBkYXRhPy5tb2R1bGUgPT09ICdET0NVTUVOVCcpIHtcbiAgICAgIDxycy1tb2R1bGUtcGRmIFtkYXRhXT1cImRhdGFcIiBbbm9kZV09XCJub2RlXCI+PC9ycy1tb2R1bGUtcGRmPlxuICAgIH0gQGxvYWRpbmcge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgQGRlZmVyICh3aGVuIGRhdGE/Lm1vZHVsZSA9PT0gJ0VEVUhUTUwnIHx8IGRhdGE/Lm1vZHVsZSA9PT0gJ0g1UCcgfHwgZGF0YT8ubW9kdWxlID09PSAnSlVQWVRFUicgfHwgZGF0YS5tb2R1bGUgPT09ICdTUFJFQURTSEVFVCcpIHtcbiAgICAgIDxycy1tb2R1bGUtZWR1LWh0bWwgW2RhdGFdPVwiZGF0YVwiIFtub2RlXT1cIm5vZGVcIj48L3JzLW1vZHVsZS1lZHUtaHRtbD5cbiAgICB9IEBsb2FkaW5nIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIEBkZWZlciAod2hlbiBkYXRhPy5tb2R1bGUgPT09ICdBVURJTycpe1xuICAgICAgPHJzLW1vZHVsZS1hdWRpbyBbZGF0YV09XCJkYXRhXCIgW25vZGVdPVwibm9kZVwiPjwvcnMtbW9kdWxlLWF1ZGlvPlxuICAgIH0gQGxvYWRpbmcge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgQGRlZmVyICh3aGVuIGRhdGE/Lm1vZHVsZSA9PT0gJ0JJTkRFUicpe1xuICAgICAgPHJzLW1vZHVsZS1iaW5kZXIgW2RhdGFdPVwiZGF0YVwiIFtub2RlXT1cIm5vZGVcIj48L3JzLW1vZHVsZS1iaW5kZXI+XG4gICAgfSBAbG9hZGluZyB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgICBAZGVmZXIgKHdoZW4gZGF0YT8ubW9kdWxlID09PSAnRERCJyl7XG4gICAgICA8cnMtbW9kdWxlLWRkYiBbZGF0YV09XCJkYXRhXCIgW25vZGVdPVwibm9kZVwiPjwvcnMtbW9kdWxlLWRkYj5cbiAgICB9IEBsb2FkaW5nIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhLm1vZHVsZSA9PT0gJ2RlZmF1bHQnXCI+XG4gICAgICBAZGVmZXIgKHdoZW4gZGF0YS5tb2R1bGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICA8cnMtbW9kdWxlLWRlZmF1bHQgW25vZGVdPVwibm9kZVwiPjwvcnMtbW9kdWxlLWRlZmF1bHQ+XG4gICAgICB9XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGEubW9kdWxlID09PSAndXJsJ1wiPlxuICAgICAgQGRlZmVyICh3aGVuIGRhdGEubW9kdWxlID09PSAndXJsJykge1xuICAgICAgICA8cnMtbW9kdWxlLXVybCBbbm9kZV09XCJub2RlXCIgW2RhdGFdPVwiZGF0YVwiPjwvcnMtbW9kdWxlLXVybD5cbiAgICAgIH1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YS5tb2R1bGUgPT09ICdFUlJPUidcIj5cbiAgICAgIEBkZWZlciAod2hlbiBkYXRhLm1vZHVsZSA9PT0gJ0VSUk9SJykge1xuICAgICAgICA8cnMtbW9kdWxlLWVycm9yIFtub2RlXT1cIm5vZGVcIiBbZGF0YV09XCJkYXRhXCI+PC9ycy1tb2R1bGUtZXJyb3I+XG4gICAgICB9XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwiaW5saW5lLW1ldGFkYXRhXCIgKm5nSWY9XCJkaXNwbGF5TW9kZSA9PT0gJ2lubGluZScgJiYgbm9kZVwiPlxuICAgIDxkaXY+VE9ETyBJTkxJTkU8L2Rpdj5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dJbmxpbmVNZXRhZGF0YSA9ICFzaG93SW5saW5lTWV0YWRhdGFcIlxuICAgICAgICAgICAgY2RrT3ZlcmxheU9yaWdpbiAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgID48aSBlc0ljb249XCJpbmZvX291dGxpbmVcIj48L2k+PC9idXR0b24+XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJzaG93SW5saW5lTWV0YWRhdGFcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aF09XCIzMDBcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGVpZ2h0XT1cIjMwMFwiXG4gICAgICAoYmFja2Ryb3BDbGljayk9XCJzaG93SW5saW5lTWV0YWRhdGEgPSBmYWxzZVwiXG4gICAgICAoZGV0YWNoKT1cInNob3dJbmxpbmVNZXRhZGF0YSA9IGZhbHNlXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLW1ldGFkYXRhLXBhbmVsXCI+XG4gICAgICAgIDxlcy1tZHMtdmlld2VyXG4gICAgICAgICAgZ3JvdXBJZD1cImlvX3JlbmRlcl9pbmxpbmVcIlxuICAgICAgICAgIFtkYXRhXT1cIm5vZGUucHJvcGVydGllcyEhXCJcbiAgICAgICAgPjwvZXMtbWRzLXZpZXdlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIiAqbmdJZj1cIihyZW5kZXJEYXRhJCB8IGFzeW5jKSA9PT0gbnVsbDtcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvZ3Jlc3MkIHwgYXN5bmMgYXMgcHJvZ3Jlc3NcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIlsnVklERU8nLCAnQVVESU8nXS5pbmNsdWRlcyhwcm9ncmVzcy5tb2R1bGUpID8gJ2JhcicgOiAnc3Bpbm5lcidcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2JhcidcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKHByb2dyZXNzLnByb2dyZXNzID8/IDApIDwgMFwiPlF1ZXVlIHBvc2l0aW9uOiB7ey0ocHJvZ3Jlc3MucHJvZ3Jlc3MgPz8gMCl9fTwvZGl2PlxuICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIFt2YWx1ZV09XCIocHJvZ3Jlc3MucHJvZ3Jlc3MgPz8gMClcIiAqbmdJZj1cIihwcm9ncmVzcy5wcm9ncmVzcyA/PyAwKSA+PSAwXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NwaW5uZXInXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIihwcm9ncmVzcy5wcm9ncmVzcyA/PyAwKSA8IDBcIj5RdWV1ZSBwb3NpdGlvbjoge3stKHByb2dyZXNzLnByb2dyZXNzID8/IDApfTwvZGl2PlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiNTBcIiAqbmdJZj1cIihwcm9ncmVzcy5wcm9ncmVzcyA/PyAwKSA+PSAwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFRbkQsT0FBTyxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU1RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUMsbUJBQW1CLEVBQXNCLE1BQU0scUJBQXFCLENBQUM7QUFDN0UsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFNcEUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBT3RDLE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsd0JBQXdCLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFFaEYsT0FBTyxFQUFDLDRCQUE0QixFQUFtQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3RILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHNCQUFzQixD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NEJBQ2xCLGVBQWU7NEJBQ2YsY0FBYzs0QkFDZCxjQUFjOzRCQUNkLHdCQUF3Qjs0QkFDeEIsb0JBQW9COzRCQUNwQixPQUFPOzRCQUNQLFlBQVk7NEJBQ1osWUFBWTs0QkFDWixnQkFBZ0I7NEJBQ2hCLGdCQUFnQjs0QkFDaEIsZUFBZTs0QkFDZixjQUFjOzRCQUNkLGVBQWU7NEJBQ2YsWUFBWTs0QkFDWixtQkFBbUI7NEJBQ25CLHdCQUF3Qjs0QkFDeEIsY0FBYzs0QkFDZCxtQkFBbUI7NEJBQ25CLGdCQUFnQjs0QkFDaEIsZUFBZTt5QkFDaEIsYUFDVTs0QkFDVCxnQkFBZ0I7eUJBQ2pCOzs4QkF5QkUsUUFBUTs7OEJBQUksTUFBTTsrQkFBQyw0QkFBNEI7NkNBcEJ6QyxXQUFXOzBCQUFuQixLQUFLO29CQUNHLE9BQU87MEJBQWYsS0FBSztvQkFDRyxJQUFJOzBCQUFaLEtBQUs7b0JBQ0csZ0JBQWdCOzBCQUF4QixLQUFLO29CQUNHLHFCQUFxQjswQkFBN0IsS0FBSztvQkFDRyxRQUFROzBCQUFoQixLQUFLO29CQUNHLFdBQVc7MEJBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE9wdGlvbmFsLCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UmVuZGVyaW5nTW9kdWxlfSBmcm9tICcuL3JlbmRlcmluZy5tb2R1bGUnO1xuaW1wb3J0IHtcbiAgSm9iSW5mb0NvbnRyb2xsZXJTZXJ2aWNlLFxuICBKb2JJbmZvUmVwbHksXG4gIFJlbmRlckNvbnRyb2xsZXJXcmFwcGVyU2VydmljZSxcbiAgUmVuZGVyRGF0YVJlcXVlc3RXaXRoVG9rZW4sXG4gIFJlbmRlckRhdGFSZXNwb25zZVxufSBmcm9tICduZ3gtcmVuZGVyaW5nLXNlcnZpY2UtYXBpJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGZpcnN0VmFsdWVGcm9tLCBpbnRlcnZhbCwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YWtlVW50aWx9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtJbWFnZUNvbXBvbmVudH0gZnJvbSAnLi9tb2R1bGUvaW1hZ2UvaW1hZ2UuY29tcG9uZW50JztcbmltcG9ydCB7UmVuZGVyaW5nQXBpTW9kdWxlfSBmcm9tICcuL3JlbmRlcmluZy1hcGkubW9kdWxlJztcbmltcG9ydCB7VmlkZW9Db21wb25lbnR9IGZyb20gJy4vbW9kdWxlL3ZpZGVvL3ZpZGVvLmNvbXBvbmVudCc7XG5pbXBvcnQge01hdFByb2dyZXNzU3Bpbm5lck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQge0VkdVNoYXJpbmdBcGlNb2R1bGUsIE5vZGUsIFJlc3RDb25zdGFudHN9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHtNYXRQcm9ncmVzc0Jhck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7QXNzZXRTdGF0ZUl0ZW0sIFJlbmRlckRhdGF9IGZyb20gJy4vZHRvL1JlbmRlckRhdGEnO1xuaW1wb3J0IHtQZGZDb21wb25lbnR9IGZyb20gJy4vbW9kdWxlL3BkZi9wZGYuY29tcG9uZW50JztcbmltcG9ydCB7VXJsQ29tcG9uZW50fSBmcm9tICcuL21vZHVsZS91cmwvdXJsLmNvbXBvbmVudCc7XG5pbXBvcnQge0VkdUh0bWxDb21wb25lbnR9IGZyb20gJy4vbW9kdWxlL2VkdWh0bWwvZWR1SHRtbC5jb21wb25lbnQnO1xuaW1wb3J0IHtNb2R1bGVJbmZvU2VydmljZX0gZnJvbSAnLi4vbW9kdWxlLWluZm8uc2VydmljZSc7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtQbGF0Zm9ybUxvY2F0aW9ufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtEZWZhdWx0Q29tcG9uZW50fSBmcm9tICcuL21vZHVsZS9kZWZhdWx0L2RlZmF1bHQuY29tcG9uZW50JztcbmltcG9ydCB7RnJvbnRlbmRNb2R1bGVDb25maWd9IGZyb20gJy4vZHRvL0Zyb250ZW5kTW9kdWxlQ29uZmlnJztcbmltcG9ydCB7QXVkaW9Db21wb25lbnR9IGZyb20gJy4vbW9kdWxlL2F1ZGlvL2F1ZGlvLmNvbXBvbmVudCc7XG5pbXBvcnQge0JpbmRlckNvbXBvbmVudH0gZnJvbSAnLi9tb2R1bGUvYmluZGVyL2JpbmRlci5jb21wb25lbnQnO1xuaW1wb3J0IHtEZGJDb21wb25lbnR9IGZyb20gJy4vbW9kdWxlL2RkYi9kZGIuY29tcG9uZW50JztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RWR1U2hhcmluZ1VpQ29tbW9uTW9kdWxlLCBFZHVTaGFyaW5nVWlNb2R1bGV9IGZyb20gJ25neC1lZHUtc2hhcmluZy11aSc7XG5pbXBvcnQge0Vycm9yQ29tcG9uZW50fSBmcm9tICcuL21vZHVsZS9lcnJvci9lcnJvci5jb21wb25lbnQnO1xuaW1wb3J0IHtSRU5ERVJJTkdfU0VSVklDRV9MSUJfQ09ORklHLCBSZW5kZXJpbmdTZXJ2aWNlTGliQ29uZmlndXJhdGlvbn0gZnJvbSAnLi4vcmVuZGVyaW5nLXNlcnZpY2UtbGliLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQge01hdEljb24sIE1hdEljb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHtDZGtDb25uZWN0ZWRPdmVybGF5LCBDZGtPdmVybGF5T3JpZ2lufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JzLXJvb3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgUmVuZGVyaW5nQXBpTW9kdWxlLFxuICAgIFJlbmRlcmluZ01vZHVsZSxcbiAgICBJbWFnZUNvbXBvbmVudCxcbiAgICBWaWRlb0NvbXBvbmVudCxcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgTWF0SWNvbixcbiAgICBQZGZDb21wb25lbnQsXG4gICAgVXJsQ29tcG9uZW50LFxuICAgIEVkdUh0bWxDb21wb25lbnQsXG4gICAgRGVmYXVsdENvbXBvbmVudCxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgQXVkaW9Db21wb25lbnQsXG4gICAgQmluZGVyQ29tcG9uZW50LFxuICAgIERkYkNvbXBvbmVudCxcbiAgICBFZHVTaGFyaW5nQXBpTW9kdWxlLFxuICAgIEVkdVNoYXJpbmdVaUNvbW1vbk1vZHVsZSxcbiAgICBFcnJvckNvbXBvbmVudCxcbiAgICBDZGtDb25uZWN0ZWRPdmVybGF5LFxuICAgIENka092ZXJsYXlPcmlnaW4sXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBUcmFuc2xhdGVTZXJ2aWNlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yZW5kZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcmVuZGVyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBSZW5kZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGRpc3BsYXlNb2RlOiAnZnVsbCcgfCAnaW5saW5lJyA9ICdmdWxsJztcbiAgQElucHV0KCkgcmVxdWVzdDogUmVuZGVyRGF0YVJlcXVlc3RXaXRoVG9rZW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIG5vZGU6IE5vZGUgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHNlcnZpY2VXb3JrZXJVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgYWN0aXZhdGVTZXJ2aWNlV29ya2VyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYXNzZXRVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSByZXNvdXJjZVVybDogc3RyaW5nID0gJyc7XG4gIHNlcnZpY2VXb3JrZXJSZWFkeSA9IGZhbHNlO1xuICBsb2FkRGF0YSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHJlbmRlckRhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZW5kZXJEYXRhIHwgbnVsbD4obnVsbCk7XG4gIGZpbmlzaGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgc29tZUJ1dE5vdEFsbEZpbmlzaGVkID0gbmV3IFN1YmplY3Q8Qm9vbGVhbj4oKVxuICBwcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgbW9kdWxlOiBzdHJpbmcsIHByb2dyZXNzPzogbnVtYmVyIH0gfCBudWxsPihudWxsKTtcbiAgc2hvd0lubGluZU1ldGFkYXRhOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJDb250cm9sbGVyU2VydmljZTogUmVuZGVyQ29udHJvbGxlcldyYXBwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgam9iSW5mb0NvbnRyb2xsZXJTZXJ2aWNlOiBKb2JJbmZvQ29udHJvbGxlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2R1bGVJbmZvU2VydmljZTogTW9kdWxlSW5mb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybUxvY2F0aW9uOiBQbGF0Zm9ybUxvY2F0aW9uLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUkVOREVSSU5HX1NFUlZJQ0VfTElCX0NPTkZJRykgcHVibGljIGNvbmZpZ3VyYXRpb246IFJlbmRlcmluZ1NlcnZpY2VMaWJDb25maWd1cmF0aW9uLFxuICApIHtcbiAgICB0aGlzLmxvYWREYXRhLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5ub2RlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZXJ2aWNlV29ya2VyUmVhZHkpLFxuICAgICAgZGVib3VuY2VUaW1lKDEwKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIC8vIHN1YnNjcmliZSBlcnJvciBoYW5kbGluZ1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja01vZHVsZSgpXG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGFzeW5jIChmcm9udGVuZE1vZHVsZSkgPT4ge1xuICAgICAgICAvLyBObyBmdXJ0aGVyIGNhbGxzIHRvIHJzMiBuZWNlc3NhcnkgaWYgd2UgaGF2ZSBhIGZyb250ZW5kIG9ubHkgbW9kdWxlXG4gICAgICAgIGlmIChmcm9udGVuZE1vZHVsZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGRhdGE6IFJlbmRlckRhdGEgPSB7XG4gICAgICAgICAgICBtb2R1bGU6IGZyb250ZW5kTW9kdWxlLm1vZHVsZSxcbiAgICAgICAgICAgIGZyb250ZW5kTW9kdWxlQ29uZmlnOiBmcm9udGVuZE1vZHVsZVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbmRlckRhdGEkLm5leHQoZGF0YSlcbiAgICAgICAgICB0aGlzLmZpbmlzaGVkLm5leHQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJSZXNwb25zZURhdGEgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlbmRlckNvbnRyb2xsZXJTZXJ2aWNlLmdldFJlbmRlckRhdGFUb2tlbih0aGlzLnJlcXVlc3QhISkpXG4gICAgICAgICAgICAvLyBDYXNlIDE6IG5vIGpvYiByZXR1cm5lZCA9PiBubyBwb2xsaW5nIG5lZWRlZFxuICAgICAgICAgICAgaWYgKHJlbmRlclJlc3BvbnNlRGF0YS5qb2JJZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlbmRlcmluZ1Jlc3BvbnNlV2l0aG91dEpvYihyZW5kZXJSZXNwb25zZURhdGEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzJC5uZXh0KHttb2R1bGU6IHJlbmRlclJlc3BvbnNlRGF0YS5tb2R1bGUgPz8gJyd9KTtcbiAgICAgICAgICAgICAgaW50ZXJ2YWwoNTAwKS5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmZpbmlzaGVkKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5qb2JJbmZvQ29udHJvbGxlclNlcnZpY2UuZ2V0Sm9iSW5mbyh7am9iSWQ6IHJlbmRlclJlc3BvbnNlRGF0YS5qb2JJZCEhfSkucGlwZSgpKSxcbiAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IGFzeW5jIChqb2JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBTb21lLCBidXQgbm90IGFsbCwgam9icyBhcmUgaW4gYSBmaW5hbCBzdGF0dXMgKHRoaXMgbWVhbnMgc29tZSBhcmUgc3RpbGwgUVVFVUVEIG9yIFBST0NFU1NJTkcpXG4gICAgICAgICAgICAgICAgICBpZiAoam9iSW5mby5qb2JzLnNvbWUoaiA9PiBqLnN0YXR1cyA9PT0gJ0ZJTklTSEVEJykgJiYgam9iSW5mby5zdGF0dXMgIT09ICdGSU5JU0hFRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVKb2JJbmZvV2l0aFN1YkpvYnNJblByb2dyZXNzKHJlbmRlclJlc3BvbnNlRGF0YSwgam9iSW5mbylcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFpbiBqb2IgZmluaXNoZWQgb3IgcGFydGlhbGx5IGZhaWxlZFxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqb2JJbmZvLnN0YXR1cyA9PT0gJ0ZJTklTSEVEJyB8fCBqb2JJbmZvLnN0YXR1cyA9PT0gJ1BBUlRJQUxMWV9GQUlMRUQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmluaXNoZWRPclBhcnRpYWxKb2JJbmZvKHJlbmRlclJlc3BvbnNlRGF0YSwgam9iSW5mbylcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFpbiBqb2IgZmFpbGVkID0+IG5vIG1vZHVsZSBidXQgZXJyb3IgcGFnZVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqb2JJbmZvLnN0YXR1cyA9PT0gJ0ZBSUxFRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGYWlsZWRNYWluSm9iKGpvYkluZm8pXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBubyBmaW5pc2hlZCBqb2JzIC0+IHNob3cgZWl0aGVyIG9uZSBwcm9ncmVzcyBiYXIgd2l0aCByYWNlIGxlYWRlciAocHJvZ3Jlc3MgMC0xMDApXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIHF1ZXVlIHBvc2l0aW9uIChwcm9ncmVzcyAoLWluZiwtMV0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlTWFpbkpvYldpdGhOb1N1YkpvYkluRmluYWxTdGF0dXMoam9iSW5mbylcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFwaUVycm9yKGVycm9yKVxuICAgICAgICAgICAgICAgIH19KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBcGlFcnJvcihlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlQXBpRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVBcGlFcnJvcihlcnJvcjogYW55KSB7XG4gICAgY29uc3QgcHVibGljTWVzc2FnZSA9IGVycm9yLmVycm9yLnVzZXJNZXNzYWdlID8/ICdHRU5FUklDX0VSUk9SX01FU1NBR0UnXG4gICAgY29uc3QgZGF0YTogUmVuZGVyRGF0YSA9IHtcbiAgICAgIG1vZHVsZTogJ0VSUk9SJyxcbiAgICAgIHB1YmxpY0Vycm9yTWVzc2FnZTogcHVibGljTWVzc2FnZVxuICAgIH1cbiAgICB0aGlzLnJlbmRlckRhdGEkLm5leHQoZGF0YSlcbiAgICB0aGlzLmZpbmlzaGVkLm5leHQoKVxuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuYXNzZXRVcmwgIT09ICcnKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYXNzZXRzVXJsID0gdGhpcy5hc3NldFVybDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFjdGl2YXRlU2VydmljZVdvcmtlcikge1xuICAgICAgdGhpcy5zZXJ2aWNlV29ya2VyUmVhZHkgPSB0cnVlO1xuICAgICAgdGhpcy5sb2FkRGF0YS5uZXh0KCk7XG4gICAgfVxuICAgIC8vIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMudHJhbnNsYXRpb25zU2VydmljZS5pbml0aWFsaXplKCkpXG4gICAgaWYgKCdzZXJ2aWNlV29ya2VyJyBpbiBuYXZpZ2F0b3IpIHtcbiAgICAgIGNvbnN0IHJlZyA9IGF3YWl0IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLmdldFJlZ2lzdHJhdGlvbnMoKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJlZz8ubWFwKChyOiBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKSA9PiByLnVucmVnaXN0ZXIoKSkpO1xuICAgICAgY29uc3Qgc2VydmljZVdvcmtlclVybCA9IHRoaXMuc2VydmljZVdvcmtlclVybCA/PyAodGhpcy5wbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpICsgJ2VkdS1zZXJ2aWNlLXdvcmtlci5qcycpO1xuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLnNlcnZpY2VXb3JrZXJVcmwgPyAnLycgOiB0aGlzLnBsYXRmb3JtTG9jYXRpb24uZ2V0QmFzZUhyZWZGcm9tRE9NKCk7XG4gICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3RlcihzZXJ2aWNlV29ya2VyVXJsLCB7XG4gICAgICAgIHNjb3BlOiBzY29wZVxuICAgICAgfSk7XG4gICAgICBpZiAocmVnaXN0cmF0aW9uLndhaXRpbmcpIHtcbiAgICAgICAgcmVnaXN0cmF0aW9uLndhaXRpbmcucG9zdE1lc3NhZ2Uoe3R5cGU6ICdTS0lQX1dBSVRJTkcnfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlcnZpY2VXb3JrZXJSZWFkeSA9IHRydWU7XG4gICAgICB0aGlzLmxvYWREYXRhLm5leHQoKTtcbiAgICAgIHJlZ2lzdHJhdGlvbi5vbnVwZGF0ZWZvdW5kID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdXb3JrZXIgPSByZWdpc3RyYXRpb24uaW5zdGFsbGluZztcbiAgICAgICAgaWYgKG5ld1dvcmtlcikge1xuICAgICAgICAgIG5ld1dvcmtlci5vbnN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG5ld1dvcmtlci5zdGF0ZSA9PT0gJ2luc3RhbGxlZCcpIHtcbiAgICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICBuZXdXb3JrZXIucG9zdE1lc3NhZ2Uoe3R5cGU6ICdTS0lQX1dBSVRJTkcnfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udHJvbGxlcmNoYW5nZScsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdTZXJ2aWNlIFdvcmtlciBjb250cm9sbGluZyB0aGlzIHBhZ2UuJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NlcnZpY2Ugd29ya2VyIEFQSSBub3QgYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoXzogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMubG9hZERhdGEubmV4dCgpO1xuICB9XG5cbiAgYXN5bmMgY2hlY2tNb2R1bGUoKTogUHJvbWlzZTxGcm9udGVuZE1vZHVsZUNvbmZpZyB8IG51bGw+IHtcbiAgICBpZiAoIWF3YWl0IHRoaXMubW9kdWxlSW5mb1NlcnZpY2UuaXNBdmFpbGFibGVCYWNrZW5kT2JqZWN0KHRoaXMubm9kZSkpIHtcbiAgICAgIGlmICh0aGlzLm5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2R1bGVJbmZvU2VydmljZS5nZXRGcm9udGVuZE1vZHVsZVNldHRpbmcodGhpcy5ub2RlKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHttb2R1bGU6ICdkZWZhdWx0JywgdXJsTW9kdWxlQ29uZmlnOiBudWxsfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVJlbmRlcmluZ1Jlc3BvbnNlV2l0aG91dEpvYihyZW5kZXJEYXRhUmVzcG9uc2U6IFJlbmRlckRhdGFSZXNwb25zZSkge1xuICAgIGNvbnN0IGl0ZW1zID0gcmVuZGVyRGF0YVJlc3BvbnNlLm9iamVjdExpbmtzPy5tYXAoaXRlbSA9PiB7XG4gICAgICBjb25zdCBhc3NldEl0ZW06IEFzc2V0U3RhdGVJdGVtID0ge1xuICAgICAgICBsaW5rOiBpdGVtLmxpbmssXG4gICAgICAgIHByb2dyZXNzOiAxMDAsXG4gICAgICAgIGhlaWdodDogaXRlbS5oZWlnaHQsXG4gICAgICAgIHdpZHRoOiBpdGVtLndpZHRoLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6ICdGSU5JU0hFRCdcbiAgICAgIH1cbiAgICAgIHJldHVybiBhc3NldEl0ZW1cbiAgICB9KVxuICAgIGNvbnN0IGRhdGE6IFJlbmRlckRhdGEgPSB7XG4gICAgICBtb2R1bGU6IHJlbmRlckRhdGFSZXNwb25zZS5tb2R1bGUgPz8gJycsXG4gICAgICBpdGVtczogaXRlbXNcbiAgICB9XG4gICAgcmVuZGVyRGF0YVJlc3BvbnNlLm9iamVjdExpbmtzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yZW5kZXJEYXRhJC5uZXh0KGRhdGEpO1xuICAgIHRoaXMuZmluaXNoZWQubmV4dCgpO1xuICB9XG5cbiAgaGFuZGxlSm9iSW5mb1dpdGhTdWJKb2JzSW5Qcm9ncmVzcyhyZW5kZXJEYXRhUmVzcG9uc2U6IFJlbmRlckRhdGFSZXNwb25zZSwgam9iSW5mbzogSm9iSW5mb1JlcGx5KSB7XG4gICAgY29uc3QgaXRlbXMgPSBqb2JJbmZvLmpvYnMubWFwKHN1YkpvYiA9PiB7XG4gICAgICBjb25zdCBhc3NldEl0ZW06IEFzc2V0U3RhdGVJdGVtID0ge1xuICAgICAgICBsaW5rOiBzdWJKb2Iub2JqZWN0TGluaz8ubGluayA/PyAnJyxcbiAgICAgICAgcHJvZ3Jlc3M6IHN1YkpvYi5zdGF0dXMgIT09ICdRVUVVRUQnID8gc3ViSm9iLnByb2dyZXNzIDogLShzdWJKb2IucHJvZ3Jlc3MgKyAxKSxcbiAgICAgICAgaGVpZ2h0OiBzdWJKb2Iub2JqZWN0TGluaz8uaGVpZ2h0ID8/IHN1YkpvYi5xdWFsaXR5LFxuICAgICAgICB3aWR0aDogc3ViSm9iLm9iamVjdExpbms/LndpZHRoID8/IDAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiBzdWJKb2IuYWRkaXRpb25hbERhdGEsXG4gICAgICAgIHN0YXR1czogc3ViSm9iLnN0YXR1cyxcbiAgICAgIH1cbiAgICAgIHJldHVybiBhc3NldEl0ZW1cbiAgICB9KVxuICAgIGNvbnN0IGRhdGE6IFJlbmRlckRhdGEgPSB7XG4gICAgICBtb2R1bGU6IHJlbmRlckRhdGFSZXNwb25zZS5tb2R1bGUgPz8gJycsXG4gICAgICBpdGVtczogaXRlbXNcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJEYXRhJC5uZXh0KGRhdGEpXG4gICAgdGhpcy5zb21lQnV0Tm90QWxsRmluaXNoZWQubmV4dCh0cnVlKVxuICB9XG5cbiAgaGFuZGxlRmluaXNoZWRPclBhcnRpYWxKb2JJbmZvKHJlbmRlckRhdGFSZXNwb25zZTogUmVuZGVyRGF0YVJlc3BvbnNlLCBqb2JJbmZvOiBKb2JJbmZvUmVwbHkpIHtcbiAgICBjb25zdCBpdGVtcyA9IGpvYkluZm8uam9icy5tYXAoc3ViSm9iID0+IHtcbiAgICAgIGNvbnN0IGFzc2V0SXRlbTogQXNzZXRTdGF0ZUl0ZW0gPSB7XG4gICAgICAgIGxpbms6IHN1YkpvYi5vYmplY3RMaW5rPy5saW5rID8/ICcnLFxuICAgICAgICBwcm9ncmVzczogc3ViSm9iLnByb2dyZXNzLFxuICAgICAgICBoZWlnaHQ6IHN1YkpvYi5vYmplY3RMaW5rPy5oZWlnaHQgPz8gc3ViSm9iLnF1YWxpdHksXG4gICAgICAgIHdpZHRoOiBzdWJKb2Iub2JqZWN0TGluaz8ud2lkdGggPz8gMCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHN1YkpvYi5hZGRpdGlvbmFsRGF0YSxcbiAgICAgICAgcHVibGljRXJyb3JNZXNzYWdlOiBzdWJKb2IucHVibGljRXJyb3JNZXNzYWdlLFxuICAgICAgICBzdGF0dXM6c3ViSm9iLnN0YXR1cyxcbiAgICAgIH1cbiAgICAgIHJldHVybiBhc3NldEl0ZW1cbiAgICB9KVxuICAgIGNvbnN0IGRhdGE6IFJlbmRlckRhdGEgPSB7XG4gICAgICBtb2R1bGU6IHJlbmRlckRhdGFSZXNwb25zZS5tb2R1bGUgPz8gJycsXG4gICAgICBpdGVtczogaXRlbXNcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJEYXRhJC5uZXh0KGRhdGEpXG4gICAgdGhpcy5maW5pc2hlZC5uZXh0KClcbiAgfVxuXG4gIGhhbmRsZUZhaWxlZE1haW5Kb2Ioam9iSW5mbzogSm9iSW5mb1JlcGx5KSB7XG4gICAgY29uc3QgZGF0YTogUmVuZGVyRGF0YSA9IHtcbiAgICAgIG1vZHVsZTogJ0VSUk9SJyxcbiAgICAgIHB1YmxpY0Vycm9yTWVzc2FnZTogam9iSW5mby51c2VyTWVzc2FnZSA/PyAnR0VORVJJQ19FUlJPUl9NRVNTQUdFJ1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckRhdGEkLm5leHQoZGF0YSlcbiAgICB0aGlzLmZpbmlzaGVkLm5leHQoKVxuICB9XG5cbiAgaGFuZGxlTWFpbkpvYldpdGhOb1N1YkpvYkluRmluYWxTdGF0dXMoam9iSW5mbzogSm9iSW5mb1JlcGx5KSB7XG4gICAgbGV0IHByb2dyZXNzID0gMFxuICAgIGlmIChqb2JJbmZvLmpvYnMuc29tZShqID0+IGouc3RhdHVzID09PSAnUFJPQ0VTU0lORycpKSB7XG4gICAgICBwcm9ncmVzcyA9IE1hdGgubWF4KC4uLmpvYkluZm8uam9icy5tYXAoaiA9PiBqLnByb2dyZXNzKSlcbiAgICB9IGVsc2UgaWYgKGpvYkluZm8uam9icy5zb21lKGogPT4gai5zdGF0dXMgPT09ICdRVUVVRUQnKSkge1xuICAgICAgcHJvZ3Jlc3MgPSAtKE1hdGgubWluKC4uLmpvYkluZm8uam9icy5tYXAoaiA9PiBqLnByb2dyZXNzICsgMSkpKVxuICAgIH1cbiAgICB0aGlzLnByb2dyZXNzJC5uZXh0KHtcbiAgICAgIG1vZHVsZTogam9iSW5mby5tb2R1bGUgPz8gJycsXG4gICAgICBwcm9ncmVzczogcHJvZ3Jlc3NcbiAgICB9KTtcbiAgfVxuXG4gIGdldEF1dGhvcnMoKTogc3RyaW5nIHtcbiAgICBjb25zb2xlLmluZm8oXCJHZXR0aW5nIGF1dGhvcnNcIilcbiAgICBpZiAodGhpcy5ub2RlPy5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlByb3BzICE9IHVuZGVmaW5lZFwiKTtcblxuICAgICAgY29uc3QgZnJlZVRleHQgPSAodGhpcy5ub2RlLnByb3BlcnRpZXNbJ2NjbTphdXRob3JfZnJlZXRleHQnXSA/PyBbXSkuam9pbignLCAnKS50cmltKCk7XG4gICAgICBjb25zb2xlLmluZm8oXCJGUkVFVEVYVDogXCIgKyBmcmVlVGV4dCk7XG5cbiAgICAgIGNvbnN0IGF1dGhvcnMgPSAodGhpcy5ub2RlLnByb3BlcnRpZXNbJ2NjbTpsaWZlY3ljbGVjb250cmlidXRlcl9hdXRob3JGTiddID8/IFtdKS5qb2luKCcsICcpLnRyaW0oKTtcbiAgICAgIGNvbnNvbGUuaW5mbyhcIkFVVEhPUlM6IFwiICsgYXV0aG9ycyk7XG5cbiAgICAgIGNvbnN0IG9yZ3MgPSAodGhpcy5ub2RlLnByb3BlcnRpZXNbJ2NjbTpsaWZlY3ljbGVjb250cmlidXRlcl9hdXRob3JWQ0FSRF9PUkcnXSA/PyBbXSkuam9pbignLCAnKS50cmltKCk7XG4gICAgICBjb25zb2xlLmluZm8oXCJPUkdTOiBcIiArIG9yZ3MpO1xuXG4gICAgICByZXR1cm4gYXV0aG9ycyArIChvcmdzID8gJywgJyArIG9yZ3MgOiAnJykgKyAoZnJlZVRleHQgPyAnLCAnICsgZnJlZVRleHQgOiAnJyk7XG4gICAgfVxuICAgIHJldHVybiBcIlwiXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtb2R1bGUgbW9kdWxlLXt7KHJlbmRlckRhdGEkIHwgYXN5bmMpPy5tb2R1bGV9fVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVuZGVyRGF0YSQgfCBhc3luYyBhcyBkYXRhXCI+XG4gICAgQGRlZmVyICh3aGVuIGRhdGE/Lm1vZHVsZSA9PT0gJ0lNQUdFJyl7XG4gICAgICA8cnMtbW9kdWxlLWltYWdlIFtkYXRhXT1cImRhdGFcIiBbbm9kZV09XCJub2RlXCI+PC9ycy1tb2R1bGUtaW1hZ2U+XG4gICAgfSBAbG9hZGluZyB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgICBAZGVmZXIgKHdoZW4gZGF0YT8ubW9kdWxlID09PSAnVklERU8nKXtcbiAgICAgIDxycy1tb2R1bGUtdmlkZW8gW2RhdGFdPVwiZGF0YVwiIFtub2RlXT1cIm5vZGVcIj48L3JzLW1vZHVsZS12aWRlbz5cbiAgICB9IEBsb2FkaW5nIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIEBkZWZlciAod2hlbiBkYXRhPy5tb2R1bGUgPT09ICdQREYnIHx8IGRhdGE/Lm1vZHVsZSA9PT0gJ0RPQ1VNRU5UJykge1xuICAgICAgPHJzLW1vZHVsZS1wZGYgW2RhdGFdPVwiZGF0YVwiIFtub2RlXT1cIm5vZGVcIj48L3JzLW1vZHVsZS1wZGY+XG4gICAgfSBAbG9hZGluZyB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgICBAZGVmZXIgKHdoZW4gZGF0YT8ubW9kdWxlID09PSAnRURVSFRNTCcgfHwgZGF0YT8ubW9kdWxlID09PSAnSDVQJyB8fCBkYXRhPy5tb2R1bGUgPT09ICdKVVBZVEVSJyB8fCBkYXRhLm1vZHVsZSA9PT0gJ1NQUkVBRFNIRUVUJykge1xuICAgICAgPHJzLW1vZHVsZS1lZHUtaHRtbCBbZGF0YV09XCJkYXRhXCIgW25vZGVdPVwibm9kZVwiPjwvcnMtbW9kdWxlLWVkdS1odG1sPlxuICAgIH0gQGxvYWRpbmcge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgQGRlZmVyICh3aGVuIGRhdGE/Lm1vZHVsZSA9PT0gJ0FVRElPJyl7XG4gICAgICA8cnMtbW9kdWxlLWF1ZGlvIFtkYXRhXT1cImRhdGFcIiBbbm9kZV09XCJub2RlXCI+PC9ycy1tb2R1bGUtYXVkaW8+XG4gICAgfSBAbG9hZGluZyB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgICBAZGVmZXIgKHdoZW4gZGF0YT8ubW9kdWxlID09PSAnQklOREVSJyl7XG4gICAgICA8cnMtbW9kdWxlLWJpbmRlciBbZGF0YV09XCJkYXRhXCIgW25vZGVdPVwibm9kZVwiPjwvcnMtbW9kdWxlLWJpbmRlcj5cbiAgICB9IEBsb2FkaW5nIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIEBkZWZlciAod2hlbiBkYXRhPy5tb2R1bGUgPT09ICdEREInKXtcbiAgICAgIDxycy1tb2R1bGUtZGRiIFtkYXRhXT1cImRhdGFcIiBbbm9kZV09XCJub2RlXCI+PC9ycy1tb2R1bGUtZGRiPlxuICAgIH0gQGxvYWRpbmcge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGEubW9kdWxlID09PSAnZGVmYXVsdCdcIj5cbiAgICAgIEBkZWZlciAod2hlbiBkYXRhLm1vZHVsZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIDxycy1tb2R1bGUtZGVmYXVsdCBbbm9kZV09XCJub2RlXCI+PC9ycy1tb2R1bGUtZGVmYXVsdD5cbiAgICAgIH1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YS5tb2R1bGUgPT09ICd1cmwnXCI+XG4gICAgICBAZGVmZXIgKHdoZW4gZGF0YS5tb2R1bGUgPT09ICd1cmwnKSB7XG4gICAgICAgIDxycy1tb2R1bGUtdXJsIFtub2RlXT1cIm5vZGVcIiBbZGF0YV09XCJkYXRhXCI+PC9ycy1tb2R1bGUtdXJsPlxuICAgICAgfVxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhLm1vZHVsZSA9PT0gJ0VSUk9SJ1wiPlxuICAgICAgQGRlZmVyICh3aGVuIGRhdGEubW9kdWxlID09PSAnRVJST1InKSB7XG4gICAgICAgIDxycy1tb2R1bGUtZXJyb3IgW25vZGVdPVwibm9kZVwiIFtkYXRhXT1cImRhdGFcIj48L3JzLW1vZHVsZS1lcnJvcj5cbiAgICAgIH1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiICpuZ0lmPVwiKHJlbmRlckRhdGEkIHwgYXN5bmMpID09PSBudWxsO1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9ncmVzcyQgfCBhc3luYyBhcyBwcm9ncmVzc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiWydWSURFTycsICdBVURJTyddLmluY2x1ZGVzKHByb2dyZXNzLm1vZHVsZSkgPyAnYmFyJyA6ICdzcGlubmVyJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmFyJ1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIocHJvZ3Jlc3MucHJvZ3Jlc3MgPz8gMCkgPCAwXCI+UXVldWUgcG9zaXRpb246IHt7LShwcm9ncmVzcy5wcm9ncmVzcyA/PyAwKX19PC9kaXY+XG4gICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgW3ZhbHVlXT1cIihwcm9ncmVzcy5wcm9ncmVzcyA/PyAwKVwiICpuZ0lmPVwiKHByb2dyZXNzLnByb2dyZXNzID8/IDApID49IDBcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3Bpbm5lcidcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKHByb2dyZXNzLnByb2dyZXNzID8/IDApIDwgMFwiPlF1ZXVlIHBvc2l0aW9uOiB7ey0ocHJvZ3Jlc3MucHJvZ3Jlc3MgPz8gMCl9PC9kaXY+XG4gICAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiICpuZ0lmPVwiKHByb2dyZXNzLnByb2dyZXNzID8/IDApID49IDBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImlubGluZS1tZXRhZGF0YVwiICpuZ0lmPVwiZGlzcGxheU1vZGUgPT09ICdpbmxpbmUnICYmIG5vZGVcIj5cbiAgICA8ZGl2PlxuICAgICAgPGEgW2hyZWZdPVwicmVzb3VyY2VVcmxcIj57eyBub2RlLnRpdGxlIHx8IG5vZGUubmFtZSB9fTwvYT4ge3sgJ1JFTkRFUklORy5BVVRIT1JFRF9CWScgfCB0cmFuc2xhdGUgfX0ge3tnZXRBdXRob3JzKCl9fVxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGUubGljZW5zZSBhcyBsaWNlbnNlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaWNlbnNlLnVybDsgZWxzZSBub0xpbmtcIj5cbiAgICAgICAgICA8YSBbaHJlZl09XCJsaWNlbnNlLnVybFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+XG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwibGljZW5zZS5pY29uXCIgYWx0PVwiTGljZW5zZSBpY29uXCIvPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9MaW5rPlxuICAgICAgICAgIDxpbWcgW3NyY109XCJsaWNlbnNlLmljb25cIiBhbHQ9XCJMaWNlbnNlIGljb25cIi8+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dJbmxpbmVNZXRhZGF0YSA9ICFzaG93SW5saW5lTWV0YWRhdGFcIlxuICAgICAgICAgICAgY2RrT3ZlcmxheU9yaWdpbiAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgID48aSBlc0ljb249XCJpbmZvX291dGxpbmVcIj48L2k+PC9idXR0b24+XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJzaG93SW5saW5lTWV0YWRhdGFcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aF09XCIzMDBcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGVpZ2h0XT1cIjMwMFwiXG4gICAgICAoYmFja2Ryb3BDbGljayk9XCJzaG93SW5saW5lTWV0YWRhdGEgPSBmYWxzZVwiXG4gICAgICAoZGV0YWNoKT1cInNob3dJbmxpbmVNZXRhZGF0YSA9IGZhbHNlXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLW1ldGFkYXRhLXBhbmVsXCI+XG4gICAgICAgIDxlcy1tZHMtdmlld2VyXG4gICAgICAgICAgZ3JvdXBJZD1cImlvX3JlbmRlcl9pbmxpbmVcIlxuICAgICAgICAgIFtkYXRhXT1cIm5vZGUucHJvcGVydGllcyEhXCJcbiAgICAgICAgPjwvZXMtbWRzLXZpZXdlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -15,7 +15,7 @@ import { MatMenu, MatMenuTrigger, MatMenuItem } from '@angular/material/menu';
15
15
  import * as i2 from 'ngx-edu-sharing-ui';
16
16
  import { EduSharingUiModule, NodesRightMode, EduSharingUiCommonModule } from 'ngx-edu-sharing-ui';
17
17
  import * as i3$2 from '@ngx-translate/core';
18
- import { TranslateService } from '@ngx-translate/core';
18
+ import { TranslateService, TranslateModule } from '@ngx-translate/core';
19
19
  import * as i4$1 from 'ngx-extended-pdf-viewer';
20
20
  import { pdfDefaultOptions, NgxExtendedPdfViewerComponent, NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer';
21
21
  import { YouTubePlayer } from '@angular/youtube-player';
@@ -688,6 +688,7 @@ class RenderComponent {
688
688
  this.displayMode = 'full';
689
689
  this.activateServiceWorker = true;
690
690
  this.assetUrl = '';
691
+ this.resourceUrl = '';
691
692
  this.serviceWorkerReady = false;
692
693
  this.loadData = new Subject();
693
694
  this.renderData$ = new BehaviorSubject(null);
@@ -898,10 +899,24 @@ class RenderComponent {
898
899
  progress: progress
899
900
  });
900
901
  }
902
+ getAuthors() {
903
+ console.info("Getting authors");
904
+ if (this.node?.properties !== undefined) {
905
+ console.info("Props != undefined");
906
+ const freeText = (this.node.properties['ccm:author_freetext'] ?? []).join(', ').trim();
907
+ console.info("FREETEXT: " + freeText);
908
+ const authors = (this.node.properties['ccm:lifecyclecontributer_authorFN'] ?? []).join(', ').trim();
909
+ console.info("AUTHORS: " + authors);
910
+ const orgs = (this.node.properties['ccm:lifecyclecontributer_authorVCARD_ORG'] ?? []).join(', ').trim();
911
+ console.info("ORGS: " + orgs);
912
+ return authors + (orgs ? ', ' + orgs : '') + (freeText ? ', ' + freeText : '');
913
+ }
914
+ return "";
915
+ }
901
916
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderComponent, deps: [{ token: i1$1.RenderControllerWrapperService }, { token: i1$1.JobInfoControllerService }, { token: ModuleInfoService }, { token: i3.PlatformLocation }, { token: RENDERING_SERVICE_LIB_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
902
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.6", type: RenderComponent, isStandalone: true, selector: "rs-root", inputs: { displayMode: "displayMode", request: "request", node: "node", serviceWorkerUrl: "serviceWorkerUrl", activateServiceWorker: "activateServiceWorker", assetUrl: "assetUrl" }, providers: [
917
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.6", type: RenderComponent, isStandalone: true, selector: "rs-root", inputs: { displayMode: "displayMode", request: "request", node: "node", serviceWorkerUrl: "serviceWorkerUrl", activateServiceWorker: "activateServiceWorker", assetUrl: "assetUrl", resourceUrl: "resourceUrl" }, providers: [
903
918
  TranslateService
904
- ], usesOnChanges: true, ngImport: i0, template: "<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\n </ng-container>\n <div class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>TODO INLINE</div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\n </div>\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}.module{overflow:auto;display:flex;flex-direction:column;gap:5px;flex-grow:1;height:auto}.module .inline-metadata{display:flex;align-items:center;gap:5px;background-color:#f8f8f8;padding:5px 20px}.module .inline-metadata>div:first-child{flex-grow:1}.module .progress{display:flex;justify-content:center;flex-grow:1}.inline-metadata-panel{box-shadow:0 3px 3px #0000001a;width:100%;height:100%;overflow-y:auto;display:flex;justify-content:center;align-items:center;background-color:#f8f8f8;padding:10px}.inline-metadata-panel>es-mds-viewer ::ng-deep .mds-viewer{width:260px}\n"], dependencies: [{ kind: "ngmodule", type: RenderingApiModule }, { kind: "ngmodule", type: RenderingModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4$2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: EduSharingApiModule }, { kind: "ngmodule", type: EduSharingUiCommonModule }, { kind: "component", type: i2.MdsViewerComponent, selector: "es-mds-viewer", inputs: ["mdsEditorInstanceService", "groupId", "setId", "data", "showGroupHeadings", "headingLevel"] }, { kind: "directive", type: i2.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], deferBlockDependencies: [() => [Promise.resolve().then(function () { return image_component; }).then(m => m.ImageComponent)], () => [Promise.resolve().then(function () { return video_component; }).then(m => m.VideoComponent)], () => [Promise.resolve().then(function () { return pdf_component; }).then(m => m.PdfComponent)], () => [Promise.resolve().then(function () { return eduHtml_component; }).then(m => m.EduHtmlComponent)], () => [import('./ngx-rendering-service-lib-audio.component-CJInS7_m.mjs').then(m => m.AudioComponent)], () => [import('./ngx-rendering-service-lib-binder.component-qTol-SZV.mjs').then(m => m.BinderComponent)], () => [import('./ngx-rendering-service-lib-ddb.component-nG3wrIO9.mjs').then(m => m.DdbComponent)], () => [import('./ngx-rendering-service-lib-default.component-DyjHM169.mjs').then(m => m.DefaultComponent)], () => [Promise.resolve().then(function () { return url_component; }).then(m => m.UrlComponent)], () => [import('./ngx-rendering-service-lib-error.component-fU1vMijU.mjs').then(m => m.ErrorComponent)]] }); }
919
+ ], usesOnChanges: true, ngImport: i0, template: "<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\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 class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>\n <a [href]=\"resourceUrl\">{{ node.title || node.name }}</a> {{ 'RENDERING.AUTHORED_BY' | translate }} {{getAuthors()}}\n <ng-container *ngIf=\"node.license as license\">\n <ng-container *ngIf=\"license.url; else noLink\">\n <a [href]=\"license.url\" target=\"_blank\" rel=\"noopener\">\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </a>\n </ng-container>\n <ng-template #noLink>\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </ng-template>\n </ng-container>\n </div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\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}.module{overflow:auto;display:flex;flex-direction:column;gap:5px;flex-grow:1;height:auto}.module .inline-metadata{display:flex;align-items:center;gap:5px;background-color:#f8f8f8;padding:5px 20px}.module .inline-metadata>div:first-child{flex-grow:1}.module .progress{display:flex;justify-content:center;flex-grow:1}.inline-metadata-panel{box-shadow:0 3px 3px #0000001a;width:100%;height:100%;overflow-y:auto;display:flex;justify-content:center;align-items:center;background-color:#f8f8f8;padding:10px}.inline-metadata-panel>es-mds-viewer ::ng-deep .mds-viewer{width:260px}\n"], dependencies: [{ kind: "ngmodule", type: RenderingApiModule }, { kind: "ngmodule", type: RenderingModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4$2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: EduSharingApiModule }, { kind: "ngmodule", type: EduSharingUiCommonModule }, { kind: "component", type: i2.MdsViewerComponent, selector: "es-mds-viewer", inputs: ["mdsEditorInstanceService", "groupId", "setId", "data", "showGroupHeadings", "headingLevel"] }, { kind: "directive", type: i2.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$2.TranslatePipe, name: "translate" }], deferBlockDependencies: [() => [Promise.resolve().then(function () { return image_component; }).then(m => m.ImageComponent)], () => [Promise.resolve().then(function () { return video_component; }).then(m => m.VideoComponent)], () => [Promise.resolve().then(function () { return pdf_component; }).then(m => m.PdfComponent)], () => [Promise.resolve().then(function () { return eduHtml_component; }).then(m => m.EduHtmlComponent)], () => [import('./ngx-rendering-service-lib-audio.component-CJInS7_m.mjs').then(m => m.AudioComponent)], () => [import('./ngx-rendering-service-lib-binder.component-qTol-SZV.mjs').then(m => m.BinderComponent)], () => [import('./ngx-rendering-service-lib-ddb.component-nG3wrIO9.mjs').then(m => m.DdbComponent)], () => [import('./ngx-rendering-service-lib-default.component-DyjHM169.mjs').then(m => m.DefaultComponent)], () => [Promise.resolve().then(function () { return url_component; }).then(m => m.UrlComponent)], () => [import('./ngx-rendering-service-lib-error.component-fU1vMijU.mjs').then(m => m.ErrorComponent)]] }); }
905
920
  }
906
921
  i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.6", ngImport: i0, type: RenderComponent, resolveDeferredDeps: () => [Promise.resolve().then(function () { return image_component; }).then(m => m.ImageComponent), Promise.resolve().then(function () { return video_component; }).then(m => m.VideoComponent), Promise.resolve().then(function () { return pdf_component; }).then(m => m.PdfComponent), Promise.resolve().then(function () { return eduHtml_component; }).then(m => m.EduHtmlComponent), import('./ngx-rendering-service-lib-audio.component-CJInS7_m.mjs').then(m => m.AudioComponent), import('./ngx-rendering-service-lib-binder.component-qTol-SZV.mjs').then(m => m.BinderComponent), import('./ngx-rendering-service-lib-ddb.component-nG3wrIO9.mjs').then(m => m.DdbComponent), import('./ngx-rendering-service-lib-default.component-DyjHM169.mjs').then(m => m.DefaultComponent), Promise.resolve().then(function () { return url_component; }).then(m => m.UrlComponent), import('./ngx-rendering-service-lib-error.component-fU1vMijU.mjs').then(m => m.ErrorComponent)], resolveMetadata: (ImageComponent, VideoComponent, PdfComponent, EduHtmlComponent, AudioComponent, BinderComponent, DdbComponent, DefaultComponent, UrlComponent, ErrorComponent) => ({ decorators: [{
907
922
  type: Component,
@@ -926,9 +941,10 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.6", ng
926
941
  ErrorComponent,
927
942
  CdkConnectedOverlay,
928
943
  CdkOverlayOrigin,
944
+ TranslateModule,
929
945
  ], providers: [
930
946
  TranslateService
931
- ], template: "<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\n </ng-container>\n <div class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>TODO INLINE</div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\n </div>\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}.module{overflow:auto;display:flex;flex-direction:column;gap:5px;flex-grow:1;height:auto}.module .inline-metadata{display:flex;align-items:center;gap:5px;background-color:#f8f8f8;padding:5px 20px}.module .inline-metadata>div:first-child{flex-grow:1}.module .progress{display:flex;justify-content:center;flex-grow:1}.inline-metadata-panel{box-shadow:0 3px 3px #0000001a;width:100%;height:100%;overflow-y:auto;display:flex;justify-content:center;align-items:center;background-color:#f8f8f8;padding:10px}.inline-metadata-panel>es-mds-viewer ::ng-deep .mds-viewer{width:260px}\n"] }]
947
+ ], template: "<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\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 class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>\n <a [href]=\"resourceUrl\">{{ node.title || node.name }}</a> {{ 'RENDERING.AUTHORED_BY' | translate }} {{getAuthors()}}\n <ng-container *ngIf=\"node.license as license\">\n <ng-container *ngIf=\"license.url; else noLink\">\n <a [href]=\"license.url\" target=\"_blank\" rel=\"noopener\">\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </a>\n </ng-container>\n <ng-template #noLink>\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </ng-template>\n </ng-container>\n </div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\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}.module{overflow:auto;display:flex;flex-direction:column;gap:5px;flex-grow:1;height:auto}.module .inline-metadata{display:flex;align-items:center;gap:5px;background-color:#f8f8f8;padding:5px 20px}.module .inline-metadata>div:first-child{flex-grow:1}.module .progress{display:flex;justify-content:center;flex-grow:1}.inline-metadata-panel{box-shadow:0 3px 3px #0000001a;width:100%;height:100%;overflow-y:auto;display:flex;justify-content:center;align-items:center;background-color:#f8f8f8;padding:10px}.inline-metadata-panel>es-mds-viewer ::ng-deep .mds-viewer{width:260px}\n"] }]
932
948
  }], ctorParameters: () => [{ type: i1$1.RenderControllerWrapperService }, { type: i1$1.JobInfoControllerService }, { type: ModuleInfoService }, { type: i3.PlatformLocation }, { type: RenderingServiceLibConfiguration, decorators: [{
933
949
  type: Optional
934
950
  }, {
@@ -946,6 +962,8 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.6", ng
946
962
  type: Input
947
963
  }], assetUrl: [{
948
964
  type: Input
965
+ }], resourceUrl: [{
966
+ type: Input
949
967
  }] } }) });
950
968
 
951
969
  class RenderingServiceLibModule {
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-rendering-service-lib.mjs","sources":["../../src/lib/asset-link.pipe.ts","../../src/lib/rendering.module.ts","../../src/lib/module/image/image.component.ts","../../src/lib/module/image/image.component.html","../../src/lib/module/video/video.component.ts","../../src/lib/module/video/video.component.html","../../src/rendering-service-lib-configuration.ts","../../src/lib/module/pdf/pdf.component.ts","../../src/lib/module/pdf/pdf.component.html","../../src/lib/dto/FrontendModuleConfig.ts","../../src/lib/module/url/url.component.ts","../../src/lib/module/url/url.component.html","../../src/lib/module/eduhtml/eduHtml.component.ts","../../src/lib/module/eduhtml/eduHtml.component.html","../../src/lib/rendering-api.module.ts","../../src/module-info.service.ts","../../src/lib/render.component.ts","../../src/lib/render.component.html","../../src/rendering-service-lib.module.ts","../../src/index.ts","../../src/ngx-rendering-service-lib.ts"],"sourcesContent":["import {Injector, Pipe, PipeTransform} from '@angular/core';\nimport {RSApiConfiguration} from 'ngx-rendering-service-api';\n\n/**\n * this pipe transforms any reported asset data uri from the rendering to the uri that is currently configured for the backend\n * this is required in case the rendering service is behind a proxy, i.e. in dev mode\n */\n@Pipe({ name: 'rsAssetLink' })\nexport class AssetLinkPipe implements PipeTransform {\n constructor(\n private injector: Injector,\n ) {\n }\n\n transform(value: string | undefined) {\n if(value) {\n const str = value.split('/public');\n str[0] = this.injector.get(RSApiConfiguration).rootUrl;\n return str.join('/public');\n }\n return value;\n }\n\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {AssetLinkPipe} from './asset-link.pipe';\nimport {EduSharingApiModule} from 'ngx-edu-sharing-api';\nimport {MatButtonModule} from '@angular/material/button';\n\n@NgModule({\n imports: [\n CommonModule,\n EduSharingApiModule.forRoot(),\n MatButtonModule,\n ],\n declarations: [\n AssetLinkPipe,\n ],\n exports: [\n CommonModule,\n AssetLinkPipe,\n ]\n})\nexport class RenderingModule {}\n","import {AfterViewInit, Component, ElementRef, HostListener, Input, signal} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {RenderData, AssetStateItem} from '../../dto/RenderData';\n\n@Component({\n selector: 'rs-module-image',\n standalone: true,\n imports: [\n RenderingModule,\n MatButtonModule,\n MatIconModule,\n ],\n templateUrl: './image.component.html',\n styleUrl: './image.component.scss'\n})\nexport class ImageComponent implements RenderModule, AfterViewInit {\n @Input() data: RenderData | undefined;\n @Input() node: Node | undefined;\n activeObject = signal<AssetStateItem | undefined>(undefined);\n constructor(public element: ElementRef) { }\n ngAfterViewInit(): void {\n this.loadOptimalSize();\n }\n\n @HostListener('document:fullscreenchange')\n private loadOptimalSize() {\n const size = this.element.nativeElement.getBoundingClientRect();\n const allFinishedItems = this.data?.items?.filter(item => item.link !== '')\n const matchingItem = allFinishedItems?.sort((a, b) => {\n // sort by the image size closest to the viewport\n return Math.abs(a.width - size.width) > Math.abs(b.width - size.width) ? 1 : -1;\n })[0]\n this.activeObject.set(matchingItem);\n }\n\n toggleFullscreen() {\n if(document.fullscreenElement) {\n void document.exitFullscreen();\n } else {\n this.element.nativeElement.requestFullscreen();\n }\n }\n}\n","<div class=\"image-wrapper\"\n *ngIf=\"activeObject()\"\n>\n <img\n #image\n [src]=\"activeObject()?.link | rsAssetLink\"\n [alt]=\"node?.title || node?.name || ''\"\n >\n <button mat-icon-button (click)=\"toggleFullscreen()\"><mat-icon>fullscreen</mat-icon></button>\n</div>\n","import {AfterViewInit, Component, ElementRef, Input, signal, ViewChild} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatIconButton} from '@angular/material/button';\nimport {FormsModule} from '@angular/forms';\nimport {RenderData, AssetStateItem} from '../../dto/RenderData';\nimport {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';\nimport {EduSharingUiModule} from 'ngx-edu-sharing-ui';\n\n@Component({\n selector: 'rs-module-video',\n standalone: true,\n imports: [\n RenderingModule,\n MatIcon,\n MatIconButton,\n FormsModule,\n MatMenu,\n MatMenuTrigger,\n MatMenuItem,\n EduSharingUiModule\n ],\n templateUrl: './video.component.html',\n styleUrl: './video.component.scss'\n})\nexport class VideoComponent implements RenderModule, AfterViewInit{\n @Input() data: RenderData | undefined;\n @Input() node: Node | undefined;\n @ViewChild('video') videoRef: ElementRef<HTMLVideoElement> | undefined\n activeObject = signal<AssetStateItem | undefined>(undefined);\n hasMultipleResolutions: Boolean = true\n\n get filteredItems(): AssetStateItem[] {\n return this.data?.items?.filter(item => item.status !== 'FAILED') || [];\n }\n\n ngAfterViewInit(): void {\n this.hasMultipleResolutions = (this.data?.items?.length ?? 1) > 1\n const downlink: number = (navigator as any).connection?.downlink;\n let optimalResolution = 720;\n if(downlink < 2) {\n optimalResolution = 240;\n }\n if(downlink > 6) {\n optimalResolution = 1080;\n }\n const allFinishedItems = this.data?.items?.filter(item => item.link !== '')\n this.activeObject.set(allFinishedItems?.sort((a, b) => {\n // sort by the image size closest to the viewport\n return Math.abs(a.width - optimalResolution) > Math.abs(b.width - optimalResolution) ? 1 : -1;\n })[0]);\n }\n\n switchResolution(item: AssetStateItem) {\n this.activeObject.set(item)\n const currentTime = this.videoRef?.nativeElement.currentTime\n this.videoRef?.nativeElement.load()\n if (currentTime !== undefined) {\n this.videoRef!.nativeElement.currentTime = currentTime\n }\n }\n\n protected readonly JSON = JSON;\n}\n","<div class=\"video-wrapper\" *ngIf=\"activeObject()\">\n <video\n controls\n #video\n >\n <source [src]=\"activeObject()?.link | rsAssetLink\" />\n </video>\n <button *ngIf=\"hasMultipleResolutions\"\n mat-icon-button\n [matMenuTriggerFor]=\"resolutionMenu\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n <mat-menu\n #resolutionMenu=\"matMenu\"\n xPosition=\"before\"\n >\n <button\n mat-menu-item\n *ngFor=\"let item of filteredItems\"\n [disabled]=\"item.link === ''\"\n (click)=\"item.height !== activeObject()?.height && switchResolution(item)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"item.link !== '' ? ready : loading\"\n [ngTemplateOutletContext]=\"{item:item}\"\n >\n </ng-container>\n </button>\n\n </mat-menu>\n</div>\n\n<ng-template #ready let-item='item'>\n <div style=\"display: flex; justify-content: space-between\">\n <mat-icon *ngIf=\"item.height === activeObject()?.height\">\n done\n </mat-icon>\n <div *ngIf=\"item.height !== activeObject()?.height\"></div>\n <div>\n {{item.height}}p\n </div>\n </div>\n</ng-template>\n\n<ng-template #loading let-item='item'>\n <div style=\"display: flex; justify-content: space-between\">\n <div>\n <ng-container *ngIf=\"item.status === 'PROCESSING'; else queue\">\n {{ 'RENDERING.CONVERTING' | translate }}: {{ item.progress }}%\n </ng-container>\n <ng-template #queue>\n {{ 'RENDERING.QUEUED' | translate }}: {{ item.progress }}\n </ng-template>\n </div>\n <div style=\"padding-left: .5em\">\n {{item.height}}p\n </div>\n </div>\n</ng-template>\n","import {Injectable, InjectionToken, Provider} from '@angular/core';\n\nexport const RENDERING_SERVICE_LIB_CONFIG = new InjectionToken<RenderingServiceLibConfiguration>(\n 'RENDERING_SERVICE_LIB_CONFIG',\n);\n@Injectable({\n providedIn: 'root',\n})\nexport class RenderingServiceLibConfiguration {\n /**\n * the assets url\n * this is important for modules that require to fetch external javascript, i.e. ng2-pdfjs-viewer\n */\n assetsUrl: string | null = null;\n static create(params: RenderingServiceLibConfigurationParams = {}): RenderingServiceLibConfiguration {\n return { ...new RenderingServiceLibConfiguration(), ...params };\n }\n}\n\nexport type RenderingServiceLibConfigurationParams = Partial<RenderingServiceLibConfiguration>;\n\nexport function getConfigProvider(params?: RenderingServiceLibConfigurationParams): Provider[] {\n return [\n // Provide the params given to `forRoot()`. These can be overridden by the application by\n // providing `EDU_SHARING_API_CONFIG` itself.\n {\n provide: RENDERING_SERVICE_LIB_CONFIG,\n useValue: params,\n }\n ];\n}\n","import {\n Component,\n HostListener,\n Inject,\n Input,\n OnChanges,\n Optional,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {RenderData} from '../../dto/RenderData';\nimport {AssetControllerService, GetAsset$Params} from 'ngx-rendering-service-api';\nimport {\n RENDERING_SERVICE_LIB_CONFIG,\n RenderingServiceLibConfiguration\n} from '../../../rendering-service-lib-configuration';\nimport {NgxExtendedPdfViewerComponent, NgxExtendedPdfViewerModule, pdfDefaultOptions} from 'ngx-extended-pdf-viewer';\nimport {NodeHelperService, NodesRightMode} from 'ngx-edu-sharing-ui';\n\n@Component({\n selector: 'rs-module-pdf',\n standalone: true,\n imports: [\n RenderingModule,\n MatButtonModule,\n MatIconModule,\n NgxExtendedPdfViewerModule\n ],\n templateUrl: './pdf.component.html',\n styleUrl: './pdf.component.scss'\n})\nexport class PdfComponent implements RenderModule, OnChanges {\n @ViewChild(NgxExtendedPdfViewerComponent) pdfViewer!: NgxExtendedPdfViewerComponent;\n @Input() data: RenderData | undefined\n @Input() node: Node | undefined\n restrictedView: boolean = false\n fileData: Uint8Array | string | undefined;\n\n constructor(\n private assetControllerService: AssetControllerService,\n private nodeHelper: NodeHelperService,\n @Optional() @Inject(RENDERING_SERVICE_LIB_CONFIG) public configuration: RenderingServiceLibConfiguration,\n ) {\n if (configuration && configuration.assetsUrl) {\n pdfDefaultOptions.assetsFolder = (configuration?.assetsUrl || '') + '/ngx-extended-pdf-viewer'\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (this.nodeHelper.getNodesRight([this.node!], 'DownloadContent', NodesRightMode.Effective)) {\n this.fileData = this.data?.items?.[0]?.link ?? ''\n } else {\n this.restrictedView = true\n this.downloadFile()\n }\n }\n\n private downloadFile() {\n if (this.data?.items === undefined || this.data.items[0].link === '') {\n return\n }\n const url = new URL(this.data.items[0].link)\n const assetParams = url.searchParams.get('assetParams')\n if (assetParams === null) {\n return\n }\n const params: GetAsset$Params = {\n assetParams: assetParams\n }\n this.assetControllerService.getAsset$Response(params)\n .subscribe(async (response) => {\n if (response.headers.get('content-type') !== 'application/octet-stream') {\n return\n }\n const arrayBuffer = await response.body.arrayBuffer();\n this.fileData = new Uint8Array(arrayBuffer);\n }\n )\n }\n\n @HostListener('window:keydown.control.s', ['$event'])\n @HostListener('window:keydown.F12', ['$event'])\n handleShortCutEvents(event: KeyboardEvent) {\n if (this.restrictedView) {\n event.preventDefault();\n if (event.stopImmediatePropagation) {\n event.stopImmediatePropagation();\n } else {\n event.stopPropagation();\n }\n }\n }\n\n @HostListener('window:contextmenu', ['$event'])\n handleContextMenu(event: MouseEvent) {\n if (this.restrictedView) {\n event.preventDefault();\n if (event.stopImmediatePropagation) {\n event.stopImmediatePropagation();\n } else {\n event.stopPropagation();\n }\n }\n }\n}\n","<div\n class=\"pdf-wrapper\"\n [class.hide-all]=\"restrictedView\"\n *ngIf=\"fileData !== undefined\"\n>\n <ngx-extended-pdf-viewer\n [src]=\"fileData\"\n [showPrintButton]=\"!restrictedView\"\n [showDownloadButton]=\"false\"\n [showOpenFileButton]=\"false\"\n [textLayer]=\"!restrictedView\"\n [enablePrint]=\"!restrictedView\"\n [showBookModeButton]=\"false\"\n [showFindHighlightAll]=\"false\"\n [showDrawEditor]=\"false\"\n [sidebarVisible]=\"false\"\n [showHighlightEditor]=\"false\"\n [showTextEditor]=\"false\"\n [height]=\"'100vh'\"\n [showSecondaryToolbarButton]=\"false\"\n [showStampEditor]=\"false\"\n >\n </ngx-extended-pdf-viewer>\n</div>\n","\nexport type FrontendModuleConfig = {\n module: string,\n urlModuleConfig: UrlModuleConfig | null\n}\n\nexport type UrlModuleConfig = {\n embedding: UrlEmbeddings,\n externalId: string\n}\n\nexport enum UrlEmbeddings {\n YOUTUBE,\n VIMEO,\n VIDEO,\n AUDIO,\n IMAGE,\n LTI13TOOL,\n H5P,\n PREZI,\n LEARNINGAPPS\n}\n","import {Component, Input, OnInit} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {YouTubePlayer} from '@angular/youtube-player';\nimport {DomSanitizer, SafeResourceUrl} from '@angular/platform-browser';\nimport {NgOptimizedImage} from '@angular/common';\nimport {RenderData} from '../../dto/RenderData';\nimport {UrlEmbeddings} from '../../dto/FrontendModuleConfig';\nimport {EduSharingUiModule} from 'ngx-edu-sharing-ui';\n\n@Component({\n selector: 'rs-module-url',\n standalone: true,\n imports: [\n RenderingModule,\n MatButtonModule,\n MatIconModule,\n YouTubePlayer,\n NgOptimizedImage,\n EduSharingUiModule,\n ],\n templateUrl: './url.component.html',\n styleUrl: './url.component.scss'\n})\nexport class UrlComponent implements RenderModule, OnInit {\n @Input() data: RenderData | undefined;\n @Input() node: Node | undefined;\n gdpr: any[] | undefined = undefined\n gdprOk: boolean = true\n embedding?: UrlEmbeddings\n externalId?: string\n sanitizedUrl: SafeResourceUrl | null = null\n url: string = ''\n\n constructor(private sanitizer: DomSanitizer) {\n }\n\n ngOnInit() {\n this.embedding = this.data?.frontendModuleConfig?.urlModuleConfig?.embedding\n this.externalId = this.data?.frontendModuleConfig?.urlModuleConfig?.externalId\n this.url = this.node?.properties?.['ccm:wwwurl']?.[0] || ''\n if (this.embedding === UrlEmbeddings.VIMEO) {\n this.sanitizedUrl = this.getVimeoUri()\n } else if (this.embedding === UrlEmbeddings.PREZI) {\n this.sanitizedUrl = this.getPreziUrl()\n } else if (this.embedding === UrlEmbeddings.LEARNINGAPPS) {\n this.sanitizedUrl = this.getLearningAppsUrl()\n }\n }\n\n isProtected(): boolean {\n return this.gdpr === undefined;\n }\n\n consentToGdprWarning() {\n this.gdprOk = true\n }\n\n getVimeoUri(): SafeResourceUrl {\n let url = '//player.vimeo.com/video/' + this.externalId\n return this.sanitizer.bypassSecurityTrustResourceUrl(url)\n }\n\n getPreziUrl(): SafeResourceUrl {\n const preziUrl = this.url.slice(-1) === '/' ? this.url.substring(0, this.url.length - 1) : this.url\n return this.sanitizer.bypassSecurityTrustResourceUrl(preziUrl)\n }\n\n getLearningAppsUrl(): SafeResourceUrl {\n const learningAppsUrl = this.url.replace('https://learningapps.org/', 'https://learningapps.org/view')\n return this.sanitizer.bypassSecurityTrustResourceUrl(learningAppsUrl)\n }\n\n protected readonly UrlEmbeddings = UrlEmbeddings;\n}\n","<div class=\"url-wrapper\">\n <div *ngIf=\"gdprOk\">\n <ng-container *ngIf=\"embedding === UrlEmbeddings.YOUTUBE && externalId !== ''\">\n <youtube-player\n [videoId]=\"externalId ?? ''\"\n [disableCookies]=\"true\"\n ></youtube-player>\n </ng-container>\n <ng-container *ngIf=\"embedding === UrlEmbeddings.VIMEO && externalId !== ''\">\n <iframe class=\"vimeoFrame\" [src]=\"sanitizedUrl\"></iframe>\n </ng-container>\n <ng-container *ngIf=\"embedding === UrlEmbeddings.AUDIO && url !== ''\" >\n <div class=\"audio-wrapper\">\n <video\n controls\n style=\"max-width: 100%\"\n [src]=\"url\"\n poster=\"assets/img/audio.svg\"\n >\n </video>\n </div>\n </ng-container>\n <ng-container *ngIf=\"embedding === UrlEmbeddings.IMAGE && url !== ''\">\n <div class=\"image-wrapper\">\n <img\n [ngSrc]=\"url\"\n [alt]=\"node?.title ?? 'Edu-Sharing image'\"\n [title]=\"node?.title ?? 'Edu-Sharing image'\"\n >\n </div>\n </ng-container>\n <ng-container *ngIf=\"embedding === UrlEmbeddings.VIDEO && url !== ''\">\n <div class=\"video-wrapper\">\n <video\n controls\n [src]=\"url\"\n >\n </video>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(embedding === UrlEmbeddings.PREZI || embedding === UrlEmbeddings.LEARNINGAPPS) && url !== ''\">\n <iframe class=\"eduUrlFrame\" [src]=sanitizedUrl allowfullscreen=\"\" allow=\"autoplay; fullscreen\" ></iframe>\n </ng-container>\n\n </div>\n <div *ngIf=\"!gdprOk\">\n {{ 'RENDERING.GDPR.GDPR_DIALOG' | translate }}\n <button mat-button (click)=\"consentToGdprWarning()\">{{'RENDERING.GDPR.GDPR_CONTINUE' | translate}}</button>\n </div>\n</div>\n","import {Component, Input, OnInit} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {RenderData} from '../../dto/RenderData';\nimport {DomSanitizer, SafeResourceUrl} from '@angular/platform-browser';\n\n@Component({\n selector: 'rs-module-edu-html',\n standalone: true,\n imports: [\n RenderingModule,\n MatButtonModule,\n MatIconModule,\n ],\n templateUrl: './eduHtml.component.html',\n styleUrl: './eduHtml.component.scss'\n})\nexport class EduHtmlComponent implements RenderModule, OnInit {\n @Input() data: RenderData | undefined\n @Input() node: Node | undefined\n sanitizedUrl: SafeResourceUrl = new class implements SafeResourceUrl {\n }\n\n constructor(private sanitizer: DomSanitizer) {\n }\n\n ngOnInit() {\n if (this.data?.items !== undefined && this.data.items[0].link) {\n this.sanitizedUrl = this.getSafeUri()\n }\n }\n\n getSafeUri() {\n if (this.data?.items !== undefined && this.data.items[0].link) {\n const uri = new URL(this.data.items[0].link)\n /**\n if (uri.hostname.includes('nip.io')) {\n uri.hostname = 'localhost'\n }\n */\n return this.sanitizer.bypassSecurityTrustResourceUrl(uri.toString())\n }\n return new class implements SafeResourceUrl {\n }\n }\n}\n","<div class=\"eduHtml-wrapper\" *ngIf=\"data?.items !== undefined\">\n <iframe class=\"frame\" [src]=\"sanitizedUrl\"></iframe>\n</div>\n","import {NgModule} from '@angular/core';\n\n@NgModule({\n imports: []\n})\nexport class RenderingApiModule {}\n","import {Injectable} from '@angular/core';\nimport {ModuleInfoControllerService} from 'ngx-rendering-service-api';\nimport {firstValueFrom} from 'rxjs';\nimport {Node, RestConstants} from 'ngx-edu-sharing-api';\nimport {FrontendModuleConfig, UrlEmbeddings, UrlModuleConfig} from './lib/dto/FrontendModuleConfig';\n\n@Injectable({providedIn: 'root'})\nexport class ModuleInfoService {\n\n private availableMediaTypes: String[] = []\n private availableMimeTypes: String[] = []\n private availableMimeTypePrefixes: String[] = []\n private availableReplicationSources: String[] = []\n private availableResourceTypes: String[] = []\n private availableRemoteRepositories: String[] = []\n\n constructor(\n private service: ModuleInfoControllerService\n ) {}\n\n async isAvailableBackendObject(node: Node| undefined): Promise<boolean> {\n if (!this.isInitialized()) {\n const result = await firstValueFrom(this.service.getModulesInfo({repoId: node?.ref.repo ?? ''}))\n result.forEach(info => {\n if (info.typeMapping.type !== undefined && info.typeMapping.type !== null) {\n this.availableMediaTypes.push(info.typeMapping.type)\n } else if (info.typeMapping.remoteRepositoryType !== undefined && info.typeMapping.remoteRepositoryType !== null) {\n this.availableRemoteRepositories.push(info.typeMapping.remoteRepositoryType)\n } else if(info.typeMapping.resourceType !== undefined && info.typeMapping.resourceType !== null) {\n this.availableResourceTypes.push(info.typeMapping.resourceType)\n } else if(info.typeMapping.replicationSource !== undefined && info.typeMapping.replicationSource !== null) {\n this.availableReplicationSources.push(info.typeMapping.replicationSource)\n } else if (info.typeMapping.mimeTypeSuffix !== undefined\n && info.typeMapping.mimeTypeSuffix !== null\n && info.typeMapping.mimeTypePrefix !== undefined\n && info.typeMapping.mimeTypePrefix !== null\n ) {\n this.availableMimeTypes.push(`${info.typeMapping.mimeTypePrefix}/${info.typeMapping.mimeTypeSuffix}`)\n } else if (info.typeMapping.mimeTypePrefix !== undefined && info.typeMapping.mimeTypePrefix !== null) {\n this.availableMimeTypePrefixes.push(info.typeMapping.mimeTypePrefix)\n }\n })\n }\n const mimeTypePrefix = (node?.mimetype ?? '').split('/', 2)[0]\n return this.availableMediaTypes.includes(node?.mediatype ?? '') ||\n this.availableRemoteRepositories.includes(node?.remote?.repository?.repositoryType ?? '') ||\n this.availableReplicationSources.includes(node?.properties?.[RestConstants.CCM_PROP_REPLICATIONSOURCE]?.[0]?? '') ||\n this.availableResourceTypes.includes(node?.properties?.[RestConstants.CCM_PROP_CCRESSOURCETYPE]?.[0]?? '') ||\n this.availableMimeTypes.includes(node?.mimetype ?? '') ||\n this.availableMimeTypePrefixes.includes(mimeTypePrefix)\n }\n\n private isInitialized(): boolean {\n return this.availableMediaTypes.length\n + this.availableMimeTypes.length\n + this.availableMimeTypePrefixes.length\n + this.availableReplicationSources.length\n + this.availableResourceTypes.length\n + this.availableRemoteRepositories.length !== 0\n }\n\n getFrontendModuleSetting(node: Node): FrontendModuleConfig {\n const urlModuleConfig = this.checkUrlModule(node)\n if (urlModuleConfig !== null) {\n return urlModuleConfig\n }\n return {\n module: 'default',\n urlModuleConfig: null\n }\n }\n\n checkUrlModule(node: Node): FrontendModuleConfig | null {\n const url = node.properties?.['ccm:wwwurl']?.[0] || ''\n const checkLearningApps = (): UrlModuleConfig | null => {\n if (node.remote?.repository?.repositoryType?.toLowerCase() === 'learningapps') {\n return {\n embedding: UrlEmbeddings.LEARNINGAPPS,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function checkYouTube\n */\n const checkYouTube = (): UrlModuleConfig | null => {\n if (node.remote?.repository?.repositoryType?.toLowerCase() === 'youtube') {\n return {\n embedding: UrlEmbeddings.YOUTUBE,\n externalId: node.remote?.id ?? ''\n }\n }\n if (url.includes('youtu.be') ) {\n const split = url.split('/')\n return {\n embedding: UrlEmbeddings.YOUTUBE,\n externalId: split[split.length - 1]\n }\n }\n if (url.includes('.youtube.com/watch?')) {\n const urlObject = new URL(url)\n return {\n embedding: UrlEmbeddings.YOUTUBE,\n externalId: urlObject.searchParams.get('v') ?? ''\n }\n }\n return null\n }\n /**\n * Function checkVimeo\n */\n const checkVimeo = (): UrlModuleConfig | null => {\n if (url.includes('vimeo.com')) {\n const split = url.split('/')\n return {\n embedding: UrlEmbeddings.VIMEO,\n externalId: split[split.length - 1]\n }\n }\n return null\n }\n const checkGenericVideo = (): UrlModuleConfig | null => {\n if (url.length > 0 && ['mp4', 'webm'].includes(url.split('.').pop() ?? '')) {\n return {\n embedding: UrlEmbeddings.VIDEO,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function checkAudio\n */\n const checkAudio = (): UrlModuleConfig | null => {\n if (url.length > 0 && node.mimetype?.startsWith('audio')) {\n return {\n embedding: UrlEmbeddings.AUDIO,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function checkLti13ToolObject\n */\n const checkLti13ToolObject = (): UrlModuleConfig | null => {\n if (node.aspects?.includes('ccm:ltitool_node')) {\n return {\n embedding: UrlEmbeddings.LTI13TOOL,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function checkImage\n */\n const checkImage = (): UrlModuleConfig | null => {\n if (node.properties?.['ccm:remoterepositorytype']?.[0] === 'DDB') {\n return null\n }\n if (node.mediatype === 'file-image') {\n return {\n embedding: UrlEmbeddings.IMAGE,\n externalId: ''\n }\n }\n const mimeTypeSplit = node.mimetype?.split('/') ?? []\n if (mimeTypeSplit.length === 2 && ['png', 'jpg', 'jpeg', 'gif'].includes(mimeTypeSplit[1])) {\n return {\n embedding: UrlEmbeddings.IMAGE,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function detectH5P\n */\n const detectH5P = (): UrlModuleConfig | null => {\n if (url.length > 0 && url.includes('h5p.org/h5p/embed')) {\n return {\n embedding: UrlEmbeddings.H5P,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function detectPrezi\n */\n const detectPrezi = (): UrlModuleConfig | null => {\n if (url.length > 0 &&\n (url.includes('prezi.com/view/') || url.includes('prezi.com/embed/') || url.includes('prezi.com/p/embed'))\n ) {\n return {\n embedding: UrlEmbeddings.PREZI,\n externalId: ''\n }\n }\n return null\n }\n\n /**\n * embedding if applicable to node\n */\n const embedding =\n checkLearningApps()\n ?? checkYouTube()\n ?? checkVimeo()\n ?? checkGenericVideo()\n ?? checkAudio()\n ?? checkImage()\n ?? checkLti13ToolObject()\n ?? detectH5P()\n ?? detectPrezi()\n\n if (embedding !== null) {\n return {\n module: 'url',\n urlModuleConfig: embedding\n }\n }\n return null\n }\n}\n","import {Component, Inject, Input, OnChanges, OnInit, Optional, SimpleChanges} from '@angular/core';\nimport {RenderingModule} from './rendering.module';\nimport {\n JobInfoControllerService,\n JobInfoReply,\n RenderControllerWrapperService,\n RenderDataRequestWithToken,\n RenderDataResponse\n} from 'ngx-rendering-service-api';\nimport {BehaviorSubject, debounceTime, firstValueFrom, interval, Subject, switchMap, takeUntil} from 'rxjs';\nimport {ImageComponent} from './module/image/image.component';\nimport {RenderingApiModule} from './rendering-api.module';\nimport {VideoComponent} from './module/video/video.component';\nimport {MatProgressSpinnerModule} from '@angular/material/progress-spinner';\nimport {EduSharingApiModule, Node} from 'ngx-edu-sharing-api';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {AssetStateItem, RenderData} from './dto/RenderData';\nimport {PdfComponent} from './module/pdf/pdf.component';\nimport {UrlComponent} from './module/url/url.component';\nimport {EduHtmlComponent} from './module/eduhtml/eduHtml.component';\nimport {ModuleInfoService} from '../module-info.service';\nimport {filter} from 'rxjs/operators';\nimport {PlatformLocation} from '@angular/common';\nimport {DefaultComponent} from './module/default/default.component';\nimport {FrontendModuleConfig} from './dto/FrontendModuleConfig';\nimport {AudioComponent} from './module/audio/audio.component';\nimport {BinderComponent} from './module/binder/binder.component';\nimport {DdbComponent} from './module/ddb/ddb.component';\nimport {TranslateService} from '@ngx-translate/core';\nimport {EduSharingUiCommonModule, EduSharingUiModule} from 'ngx-edu-sharing-ui';\nimport {ErrorComponent} from './module/error/error.component';\nimport {RENDERING_SERVICE_LIB_CONFIG, RenderingServiceLibConfiguration} from '../rendering-service-lib-configuration';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIcon, MatIconModule} from '@angular/material/icon';\nimport {CdkConnectedOverlay, CdkOverlayOrigin} from '@angular/cdk/overlay';\n\n@Component({\n selector: 'rs-root',\n standalone: true,\n imports: [\n RenderingApiModule,\n RenderingModule,\n ImageComponent,\n VideoComponent,\n MatProgressSpinnerModule,\n MatProgressBarModule,\n MatIcon,\n PdfComponent,\n UrlComponent,\n EduHtmlComponent,\n DefaultComponent,\n MatButtonModule,\n AudioComponent,\n BinderComponent,\n DdbComponent,\n EduSharingApiModule,\n EduSharingUiCommonModule,\n ErrorComponent,\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ],\n providers: [\n TranslateService\n ],\n templateUrl: './render.component.html',\n styleUrl: './render.component.scss'\n})\nexport class RenderComponent implements OnChanges, OnInit {\n @Input() displayMode: 'full' | 'inline' = 'full';\n @Input() request: RenderDataRequestWithToken | undefined;\n @Input() node: Node | undefined;\n @Input() serviceWorkerUrl: string | undefined;\n @Input() activateServiceWorker: boolean = true;\n @Input() assetUrl: string = '';\n serviceWorkerReady = false;\n loadData = new Subject<void>();\n renderData$ = new BehaviorSubject<RenderData | null>(null);\n finished = new Subject<void>();\n someButNotAllFinished = new Subject<Boolean>()\n progress$ = new BehaviorSubject<{ module: string, progress?: number } | null>(null);\n showInlineMetadata: boolean = false;\n\n constructor(\n private renderControllerService: RenderControllerWrapperService,\n private jobInfoControllerService: JobInfoControllerService,\n private moduleInfoService: ModuleInfoService,\n private platformLocation: PlatformLocation,\n @Optional() @Inject(RENDERING_SERVICE_LIB_CONFIG) public configuration: RenderingServiceLibConfiguration,\n ) {\n this.loadData.pipe(\n filter(() => this.node !== undefined && this.serviceWorkerReady),\n debounceTime(10),\n switchMap(() => {\n // subscribe error handling\n return this.checkModule()\n })\n ).subscribe({\n next: async (frontendModule) => {\n // No further calls to rs2 necessary if we have a frontend only module\n if (frontendModule !== null) {\n const data: RenderData = {\n module: frontendModule.module,\n frontendModuleConfig: frontendModule\n }\n this.renderData$.next(data)\n this.finished.next()\n } else {\n try {\n const renderResponseData = await firstValueFrom(this.renderControllerService.getRenderDataToken(this.request!!))\n // Case 1: no job returned => no polling needed\n if (renderResponseData.jobId === null) {\n this.handleRenderingResponseWithoutJob(renderResponseData)\n } else {\n this.progress$.next({module: renderResponseData.module ?? ''});\n interval(500).pipe(\n takeUntil(this.finished),\n switchMap(() => this.jobInfoControllerService.getJobInfo({jobId: renderResponseData.jobId!!}).pipe()),\n ).subscribe({\n next: async (jobInfo) => {\n // Some, but not all, jobs are in a final status (this means some are still QUEUED or PROCESSING)\n if (jobInfo.jobs.some(j => j.status === 'FINISHED') && jobInfo.status !== 'FINISHED') {\n this.handleJobInfoWithSubJobsInProgress(renderResponseData, jobInfo)\n // main job finished or partially failed\n } else if (jobInfo.status === 'FINISHED' || jobInfo.status === 'PARTIALLY_FAILED') {\n this.handleFinishedOrPartialJobInfo(renderResponseData, jobInfo)\n // Main job failed => no module but error page\n } else if (jobInfo.status === 'FAILED') {\n this.handleFailedMainJob(jobInfo)\n } else {\n // no finished jobs -> show either one progress bar with race leader (progress 0-100)\n // or queue position (progress (-inf,-1])\n this.handleMainJobWithNoSubJobInFinalStatus(jobInfo)\n }\n },\n error: error => {\n this.handleApiError(error)\n }});\n }\n } catch (error) {\n this.handleApiError(error)\n }\n }\n },\n error: (error) => {\n this.handleApiError(error)\n }\n });\n }\n\n handleApiError(error: any) {\n const publicMessage = error.error.userMessage ?? 'GENERIC_ERROR_MESSAGE'\n const data: RenderData = {\n module: 'ERROR',\n publicErrorMessage: publicMessage\n }\n this.renderData$.next(data)\n this.finished.next()\n }\n\n async ngOnInit() {\n if (this.assetUrl !== '') {\n this.configuration.assetsUrl = this.assetUrl;\n }\n if (!this.activateServiceWorker) {\n this.serviceWorkerReady = true;\n this.loadData.next();\n }\n // await firstValueFrom(this.translationsService.initialize())\n if ('serviceWorker' in navigator) {\n const reg = await navigator.serviceWorker.getRegistrations();\n await Promise.all(reg?.map((r: ServiceWorkerRegistration) => r.unregister()));\n const serviceWorkerUrl = this.serviceWorkerUrl ?? (this.platformLocation.getBaseHrefFromDOM() + 'edu-service-worker.js');\n const scope = this.serviceWorkerUrl ? '/' : this.platformLocation.getBaseHrefFromDOM();\n const registration = await navigator.serviceWorker.register(serviceWorkerUrl, {\n scope: scope\n });\n if (registration.waiting) {\n registration.waiting.postMessage({type: 'SKIP_WAITING'});\n }\n this.serviceWorkerReady = true;\n this.loadData.next();\n registration.onupdatefound = () => {\n const newWorker = registration.installing;\n if (newWorker) {\n newWorker.onstatechange = () => {\n if (newWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n newWorker.postMessage({type: 'SKIP_WAITING'});\n }\n }\n };\n }\n };\n navigator.serviceWorker.addEventListener('controllerchange', () => {\n console.info('Service Worker controlling this page.');\n });\n } else {\n console.warn('Service worker API not available');\n }\n }\n\n async ngOnChanges(_: SimpleChanges) {\n this.loadData.next();\n }\n\n async checkModule(): Promise<FrontendModuleConfig | null> {\n if (!await this.moduleInfoService.isAvailableBackendObject(this.node)) {\n if (this.node !== undefined) {\n return this.moduleInfoService.getFrontendModuleSetting(this.node)\n }\n return {module: 'default', urlModuleConfig: null}\n } else {\n return null\n }\n }\n\n handleRenderingResponseWithoutJob(renderDataResponse: RenderDataResponse) {\n const items = renderDataResponse.objectLinks?.map(item => {\n const assetItem: AssetStateItem = {\n link: item.link,\n progress: 100,\n height: item.height,\n width: item.width,\n additionalData: undefined,\n status: 'FINISHED'\n }\n return assetItem\n })\n const data: RenderData = {\n module: renderDataResponse.module ?? '',\n items: items\n }\n renderDataResponse.objectLinks !== undefined && this.renderData$.next(data);\n this.finished.next();\n }\n\n handleJobInfoWithSubJobsInProgress(renderDataResponse: RenderDataResponse, jobInfo: JobInfoReply) {\n const items = jobInfo.jobs.map(subJob => {\n const assetItem: AssetStateItem = {\n link: subJob.objectLink?.link ?? '',\n progress: subJob.status !== 'QUEUED' ? subJob.progress : -(subJob.progress + 1),\n height: subJob.objectLink?.height ?? subJob.quality,\n width: subJob.objectLink?.width ?? 0,\n additionalData: subJob.additionalData,\n status: subJob.status,\n }\n return assetItem\n })\n const data: RenderData = {\n module: renderDataResponse.module ?? '',\n items: items\n }\n this.renderData$.next(data)\n this.someButNotAllFinished.next(true)\n }\n\n handleFinishedOrPartialJobInfo(renderDataResponse: RenderDataResponse, jobInfo: JobInfoReply) {\n const items = jobInfo.jobs.map(subJob => {\n const assetItem: AssetStateItem = {\n link: subJob.objectLink?.link ?? '',\n progress: subJob.progress,\n height: subJob.objectLink?.height ?? subJob.quality,\n width: subJob.objectLink?.width ?? 0,\n additionalData: subJob.additionalData,\n publicErrorMessage: subJob.publicErrorMessage,\n status:subJob.status,\n }\n return assetItem\n })\n const data: RenderData = {\n module: renderDataResponse.module ?? '',\n items: items\n }\n this.renderData$.next(data)\n this.finished.next()\n }\n\n handleFailedMainJob(jobInfo: JobInfoReply) {\n const data: RenderData = {\n module: 'ERROR',\n publicErrorMessage: jobInfo.userMessage ?? 'GENERIC_ERROR_MESSAGE'\n }\n this.renderData$.next(data)\n this.finished.next()\n }\n\n handleMainJobWithNoSubJobInFinalStatus(jobInfo: JobInfoReply) {\n let progress = 0\n if (jobInfo.jobs.some(j => j.status === 'PROCESSING')) {\n progress = Math.max(...jobInfo.jobs.map(j => j.progress))\n } else if (jobInfo.jobs.some(j => j.status === 'QUEUED')) {\n progress = -(Math.min(...jobInfo.jobs.map(j => j.progress + 1)))\n }\n this.progress$.next({\n module: jobInfo.module ?? '',\n progress: progress\n });\n }\n}\n","<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\n </ng-container>\n <div class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>TODO INLINE</div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\n </div>\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","import {ModuleWithProviders, NgModule} from '@angular/core';\nimport {RenderComponent} from './lib/render.component';\nimport {CommonModule} from '@angular/common';\nimport {EduSharingUiConfigurationParams} from 'ngx-edu-sharing-ui/lib/edu-sharing-ui-configuration';\nimport {getConfigProvider, RenderingServiceLibConfigurationParams} from './rendering-service-lib-configuration';\n\n@NgModule({\n declarations: [],\n imports: [\n RenderComponent,\n CommonModule,\n ],\n exports: [\n CommonModule,\n RenderComponent,\n ],\n})\nexport class RenderingServiceLibModule {\n public static forRoot(\n params: RenderingServiceLibConfigurationParams\n): ModuleWithProviders<RenderingServiceLibModule> {\n return {\n ngModule: RenderingServiceLibModule,\n providers: [getConfigProvider(params)]\n };\n }\n}\n","/*\n * Public API Surface of edu-sharing-ui\n */\n\nexport * from './lib/rendering.module';\nexport * from './lib/module/image/image.component';\nexport * from './lib/module/video/video.component';\nexport * from './lib/module/pdf/pdf.component';\nexport * from './lib/module/url/url.component';\nexport * from './lib/module/eduhtml/eduHtml.component';\nexport * from './lib/render.component';\nexport * from './lib/asset-link.pipe';\nexport * from './rendering-service-lib.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.AssetLinkPipe","i3","i4","i2","i7"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-rendering-service-lib.mjs","sources":["../../src/lib/asset-link.pipe.ts","../../src/lib/rendering.module.ts","../../src/lib/module/image/image.component.ts","../../src/lib/module/image/image.component.html","../../src/lib/module/video/video.component.ts","../../src/lib/module/video/video.component.html","../../src/rendering-service-lib-configuration.ts","../../src/lib/module/pdf/pdf.component.ts","../../src/lib/module/pdf/pdf.component.html","../../src/lib/dto/FrontendModuleConfig.ts","../../src/lib/module/url/url.component.ts","../../src/lib/module/url/url.component.html","../../src/lib/module/eduhtml/eduHtml.component.ts","../../src/lib/module/eduhtml/eduHtml.component.html","../../src/lib/rendering-api.module.ts","../../src/module-info.service.ts","../../src/lib/render.component.ts","../../src/lib/render.component.html","../../src/rendering-service-lib.module.ts","../../src/index.ts","../../src/ngx-rendering-service-lib.ts"],"sourcesContent":["import {Injector, Pipe, PipeTransform} from '@angular/core';\nimport {RSApiConfiguration} from 'ngx-rendering-service-api';\n\n/**\n * this pipe transforms any reported asset data uri from the rendering to the uri that is currently configured for the backend\n * this is required in case the rendering service is behind a proxy, i.e. in dev mode\n */\n@Pipe({ name: 'rsAssetLink' })\nexport class AssetLinkPipe implements PipeTransform {\n constructor(\n private injector: Injector,\n ) {\n }\n\n transform(value: string | undefined) {\n if(value) {\n const str = value.split('/public');\n str[0] = this.injector.get(RSApiConfiguration).rootUrl;\n return str.join('/public');\n }\n return value;\n }\n\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {AssetLinkPipe} from './asset-link.pipe';\nimport {EduSharingApiModule} from 'ngx-edu-sharing-api';\nimport {MatButtonModule} from '@angular/material/button';\n\n@NgModule({\n imports: [\n CommonModule,\n EduSharingApiModule.forRoot(),\n MatButtonModule,\n ],\n declarations: [\n AssetLinkPipe,\n ],\n exports: [\n CommonModule,\n AssetLinkPipe,\n ]\n})\nexport class RenderingModule {}\n","import {AfterViewInit, Component, ElementRef, HostListener, Input, signal} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {RenderData, AssetStateItem} from '../../dto/RenderData';\n\n@Component({\n selector: 'rs-module-image',\n standalone: true,\n imports: [\n RenderingModule,\n MatButtonModule,\n MatIconModule,\n ],\n templateUrl: './image.component.html',\n styleUrl: './image.component.scss'\n})\nexport class ImageComponent implements RenderModule, AfterViewInit {\n @Input() data: RenderData | undefined;\n @Input() node: Node | undefined;\n activeObject = signal<AssetStateItem | undefined>(undefined);\n constructor(public element: ElementRef) { }\n ngAfterViewInit(): void {\n this.loadOptimalSize();\n }\n\n @HostListener('document:fullscreenchange')\n private loadOptimalSize() {\n const size = this.element.nativeElement.getBoundingClientRect();\n const allFinishedItems = this.data?.items?.filter(item => item.link !== '')\n const matchingItem = allFinishedItems?.sort((a, b) => {\n // sort by the image size closest to the viewport\n return Math.abs(a.width - size.width) > Math.abs(b.width - size.width) ? 1 : -1;\n })[0]\n this.activeObject.set(matchingItem);\n }\n\n toggleFullscreen() {\n if(document.fullscreenElement) {\n void document.exitFullscreen();\n } else {\n this.element.nativeElement.requestFullscreen();\n }\n }\n}\n","<div class=\"image-wrapper\"\n *ngIf=\"activeObject()\"\n>\n <img\n #image\n [src]=\"activeObject()?.link | rsAssetLink\"\n [alt]=\"node?.title || node?.name || ''\"\n >\n <button mat-icon-button (click)=\"toggleFullscreen()\"><mat-icon>fullscreen</mat-icon></button>\n</div>\n","import {AfterViewInit, Component, ElementRef, Input, signal, ViewChild} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatIconButton} from '@angular/material/button';\nimport {FormsModule} from '@angular/forms';\nimport {RenderData, AssetStateItem} from '../../dto/RenderData';\nimport {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';\nimport {EduSharingUiModule} from 'ngx-edu-sharing-ui';\n\n@Component({\n selector: 'rs-module-video',\n standalone: true,\n imports: [\n RenderingModule,\n MatIcon,\n MatIconButton,\n FormsModule,\n MatMenu,\n MatMenuTrigger,\n MatMenuItem,\n EduSharingUiModule\n ],\n templateUrl: './video.component.html',\n styleUrl: './video.component.scss'\n})\nexport class VideoComponent implements RenderModule, AfterViewInit{\n @Input() data: RenderData | undefined;\n @Input() node: Node | undefined;\n @ViewChild('video') videoRef: ElementRef<HTMLVideoElement> | undefined\n activeObject = signal<AssetStateItem | undefined>(undefined);\n hasMultipleResolutions: Boolean = true\n\n get filteredItems(): AssetStateItem[] {\n return this.data?.items?.filter(item => item.status !== 'FAILED') || [];\n }\n\n ngAfterViewInit(): void {\n this.hasMultipleResolutions = (this.data?.items?.length ?? 1) > 1\n const downlink: number = (navigator as any).connection?.downlink;\n let optimalResolution = 720;\n if(downlink < 2) {\n optimalResolution = 240;\n }\n if(downlink > 6) {\n optimalResolution = 1080;\n }\n const allFinishedItems = this.data?.items?.filter(item => item.link !== '')\n this.activeObject.set(allFinishedItems?.sort((a, b) => {\n // sort by the image size closest to the viewport\n return Math.abs(a.width - optimalResolution) > Math.abs(b.width - optimalResolution) ? 1 : -1;\n })[0]);\n }\n\n switchResolution(item: AssetStateItem) {\n this.activeObject.set(item)\n const currentTime = this.videoRef?.nativeElement.currentTime\n this.videoRef?.nativeElement.load()\n if (currentTime !== undefined) {\n this.videoRef!.nativeElement.currentTime = currentTime\n }\n }\n\n protected readonly JSON = JSON;\n}\n","<div class=\"video-wrapper\" *ngIf=\"activeObject()\">\n <video\n controls\n #video\n >\n <source [src]=\"activeObject()?.link | rsAssetLink\" />\n </video>\n <button *ngIf=\"hasMultipleResolutions\"\n mat-icon-button\n [matMenuTriggerFor]=\"resolutionMenu\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n <mat-menu\n #resolutionMenu=\"matMenu\"\n xPosition=\"before\"\n >\n <button\n mat-menu-item\n *ngFor=\"let item of filteredItems\"\n [disabled]=\"item.link === ''\"\n (click)=\"item.height !== activeObject()?.height && switchResolution(item)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"item.link !== '' ? ready : loading\"\n [ngTemplateOutletContext]=\"{item:item}\"\n >\n </ng-container>\n </button>\n\n </mat-menu>\n</div>\n\n<ng-template #ready let-item='item'>\n <div style=\"display: flex; justify-content: space-between\">\n <mat-icon *ngIf=\"item.height === activeObject()?.height\">\n done\n </mat-icon>\n <div *ngIf=\"item.height !== activeObject()?.height\"></div>\n <div>\n {{item.height}}p\n </div>\n </div>\n</ng-template>\n\n<ng-template #loading let-item='item'>\n <div style=\"display: flex; justify-content: space-between\">\n <div>\n <ng-container *ngIf=\"item.status === 'PROCESSING'; else queue\">\n {{ 'RENDERING.CONVERTING' | translate }}: {{ item.progress }}%\n </ng-container>\n <ng-template #queue>\n {{ 'RENDERING.QUEUED' | translate }}: {{ item.progress }}\n </ng-template>\n </div>\n <div style=\"padding-left: .5em\">\n {{item.height}}p\n </div>\n </div>\n</ng-template>\n","import {Injectable, InjectionToken, Provider} from '@angular/core';\n\nexport const RENDERING_SERVICE_LIB_CONFIG = new InjectionToken<RenderingServiceLibConfiguration>(\n 'RENDERING_SERVICE_LIB_CONFIG',\n);\n@Injectable({\n providedIn: 'root',\n})\nexport class RenderingServiceLibConfiguration {\n /**\n * the assets url\n * this is important for modules that require to fetch external javascript, i.e. ng2-pdfjs-viewer\n */\n assetsUrl: string | null = null;\n static create(params: RenderingServiceLibConfigurationParams = {}): RenderingServiceLibConfiguration {\n return { ...new RenderingServiceLibConfiguration(), ...params };\n }\n}\n\nexport type RenderingServiceLibConfigurationParams = Partial<RenderingServiceLibConfiguration>;\n\nexport function getConfigProvider(params?: RenderingServiceLibConfigurationParams): Provider[] {\n return [\n // Provide the params given to `forRoot()`. These can be overridden by the application by\n // providing `EDU_SHARING_API_CONFIG` itself.\n {\n provide: RENDERING_SERVICE_LIB_CONFIG,\n useValue: params,\n }\n ];\n}\n","import {\n Component,\n HostListener,\n Inject,\n Input,\n OnChanges,\n Optional,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {RenderData} from '../../dto/RenderData';\nimport {AssetControllerService, GetAsset$Params} from 'ngx-rendering-service-api';\nimport {\n RENDERING_SERVICE_LIB_CONFIG,\n RenderingServiceLibConfiguration\n} from '../../../rendering-service-lib-configuration';\nimport {NgxExtendedPdfViewerComponent, NgxExtendedPdfViewerModule, pdfDefaultOptions} from 'ngx-extended-pdf-viewer';\nimport {NodeHelperService, NodesRightMode} from 'ngx-edu-sharing-ui';\n\n@Component({\n selector: 'rs-module-pdf',\n standalone: true,\n imports: [\n RenderingModule,\n MatButtonModule,\n MatIconModule,\n NgxExtendedPdfViewerModule\n ],\n templateUrl: './pdf.component.html',\n styleUrl: './pdf.component.scss'\n})\nexport class PdfComponent implements RenderModule, OnChanges {\n @ViewChild(NgxExtendedPdfViewerComponent) pdfViewer!: NgxExtendedPdfViewerComponent;\n @Input() data: RenderData | undefined\n @Input() node: Node | undefined\n restrictedView: boolean = false\n fileData: Uint8Array | string | undefined;\n\n constructor(\n private assetControllerService: AssetControllerService,\n private nodeHelper: NodeHelperService,\n @Optional() @Inject(RENDERING_SERVICE_LIB_CONFIG) public configuration: RenderingServiceLibConfiguration,\n ) {\n if (configuration && configuration.assetsUrl) {\n pdfDefaultOptions.assetsFolder = (configuration?.assetsUrl || '') + '/ngx-extended-pdf-viewer'\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (this.nodeHelper.getNodesRight([this.node!], 'DownloadContent', NodesRightMode.Effective)) {\n this.fileData = this.data?.items?.[0]?.link ?? ''\n } else {\n this.restrictedView = true\n this.downloadFile()\n }\n }\n\n private downloadFile() {\n if (this.data?.items === undefined || this.data.items[0].link === '') {\n return\n }\n const url = new URL(this.data.items[0].link)\n const assetParams = url.searchParams.get('assetParams')\n if (assetParams === null) {\n return\n }\n const params: GetAsset$Params = {\n assetParams: assetParams\n }\n this.assetControllerService.getAsset$Response(params)\n .subscribe(async (response) => {\n if (response.headers.get('content-type') !== 'application/octet-stream') {\n return\n }\n const arrayBuffer = await response.body.arrayBuffer();\n this.fileData = new Uint8Array(arrayBuffer);\n }\n )\n }\n\n @HostListener('window:keydown.control.s', ['$event'])\n @HostListener('window:keydown.F12', ['$event'])\n handleShortCutEvents(event: KeyboardEvent) {\n if (this.restrictedView) {\n event.preventDefault();\n if (event.stopImmediatePropagation) {\n event.stopImmediatePropagation();\n } else {\n event.stopPropagation();\n }\n }\n }\n\n @HostListener('window:contextmenu', ['$event'])\n handleContextMenu(event: MouseEvent) {\n if (this.restrictedView) {\n event.preventDefault();\n if (event.stopImmediatePropagation) {\n event.stopImmediatePropagation();\n } else {\n event.stopPropagation();\n }\n }\n }\n}\n","<div\n class=\"pdf-wrapper\"\n [class.hide-all]=\"restrictedView\"\n *ngIf=\"fileData !== undefined\"\n>\n <ngx-extended-pdf-viewer\n [src]=\"fileData\"\n [showPrintButton]=\"!restrictedView\"\n [showDownloadButton]=\"false\"\n [showOpenFileButton]=\"false\"\n [textLayer]=\"!restrictedView\"\n [enablePrint]=\"!restrictedView\"\n [showBookModeButton]=\"false\"\n [showFindHighlightAll]=\"false\"\n [showDrawEditor]=\"false\"\n [sidebarVisible]=\"false\"\n [showHighlightEditor]=\"false\"\n [showTextEditor]=\"false\"\n [height]=\"'100vh'\"\n [showSecondaryToolbarButton]=\"false\"\n [showStampEditor]=\"false\"\n >\n </ngx-extended-pdf-viewer>\n</div>\n","\nexport type FrontendModuleConfig = {\n module: string,\n urlModuleConfig: UrlModuleConfig | null\n}\n\nexport type UrlModuleConfig = {\n embedding: UrlEmbeddings,\n externalId: string\n}\n\nexport enum UrlEmbeddings {\n YOUTUBE,\n VIMEO,\n VIDEO,\n AUDIO,\n IMAGE,\n LTI13TOOL,\n H5P,\n PREZI,\n LEARNINGAPPS\n}\n","import {Component, Input, OnInit} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {YouTubePlayer} from '@angular/youtube-player';\nimport {DomSanitizer, SafeResourceUrl} from '@angular/platform-browser';\nimport {NgOptimizedImage} from '@angular/common';\nimport {RenderData} from '../../dto/RenderData';\nimport {UrlEmbeddings} from '../../dto/FrontendModuleConfig';\nimport {EduSharingUiModule} from 'ngx-edu-sharing-ui';\n\n@Component({\n selector: 'rs-module-url',\n standalone: true,\n imports: [\n RenderingModule,\n MatButtonModule,\n MatIconModule,\n YouTubePlayer,\n NgOptimizedImage,\n EduSharingUiModule,\n ],\n templateUrl: './url.component.html',\n styleUrl: './url.component.scss'\n})\nexport class UrlComponent implements RenderModule, OnInit {\n @Input() data: RenderData | undefined;\n @Input() node: Node | undefined;\n gdpr: any[] | undefined = undefined\n gdprOk: boolean = true\n embedding?: UrlEmbeddings\n externalId?: string\n sanitizedUrl: SafeResourceUrl | null = null\n url: string = ''\n\n constructor(private sanitizer: DomSanitizer) {\n }\n\n ngOnInit() {\n this.embedding = this.data?.frontendModuleConfig?.urlModuleConfig?.embedding\n this.externalId = this.data?.frontendModuleConfig?.urlModuleConfig?.externalId\n this.url = this.node?.properties?.['ccm:wwwurl']?.[0] || ''\n if (this.embedding === UrlEmbeddings.VIMEO) {\n this.sanitizedUrl = this.getVimeoUri()\n } else if (this.embedding === UrlEmbeddings.PREZI) {\n this.sanitizedUrl = this.getPreziUrl()\n } else if (this.embedding === UrlEmbeddings.LEARNINGAPPS) {\n this.sanitizedUrl = this.getLearningAppsUrl()\n }\n }\n\n isProtected(): boolean {\n return this.gdpr === undefined;\n }\n\n consentToGdprWarning() {\n this.gdprOk = true\n }\n\n getVimeoUri(): SafeResourceUrl {\n let url = '//player.vimeo.com/video/' + this.externalId\n return this.sanitizer.bypassSecurityTrustResourceUrl(url)\n }\n\n getPreziUrl(): SafeResourceUrl {\n const preziUrl = this.url.slice(-1) === '/' ? this.url.substring(0, this.url.length - 1) : this.url\n return this.sanitizer.bypassSecurityTrustResourceUrl(preziUrl)\n }\n\n getLearningAppsUrl(): SafeResourceUrl {\n const learningAppsUrl = this.url.replace('https://learningapps.org/', 'https://learningapps.org/view')\n return this.sanitizer.bypassSecurityTrustResourceUrl(learningAppsUrl)\n }\n\n protected readonly UrlEmbeddings = UrlEmbeddings;\n}\n","<div class=\"url-wrapper\">\n <div *ngIf=\"gdprOk\">\n <ng-container *ngIf=\"embedding === UrlEmbeddings.YOUTUBE && externalId !== ''\">\n <youtube-player\n [videoId]=\"externalId ?? ''\"\n [disableCookies]=\"true\"\n ></youtube-player>\n </ng-container>\n <ng-container *ngIf=\"embedding === UrlEmbeddings.VIMEO && externalId !== ''\">\n <iframe class=\"vimeoFrame\" [src]=\"sanitizedUrl\"></iframe>\n </ng-container>\n <ng-container *ngIf=\"embedding === UrlEmbeddings.AUDIO && url !== ''\" >\n <div class=\"audio-wrapper\">\n <video\n controls\n style=\"max-width: 100%\"\n [src]=\"url\"\n poster=\"assets/img/audio.svg\"\n >\n </video>\n </div>\n </ng-container>\n <ng-container *ngIf=\"embedding === UrlEmbeddings.IMAGE && url !== ''\">\n <div class=\"image-wrapper\">\n <img\n [ngSrc]=\"url\"\n [alt]=\"node?.title ?? 'Edu-Sharing image'\"\n [title]=\"node?.title ?? 'Edu-Sharing image'\"\n >\n </div>\n </ng-container>\n <ng-container *ngIf=\"embedding === UrlEmbeddings.VIDEO && url !== ''\">\n <div class=\"video-wrapper\">\n <video\n controls\n [src]=\"url\"\n >\n </video>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(embedding === UrlEmbeddings.PREZI || embedding === UrlEmbeddings.LEARNINGAPPS) && url !== ''\">\n <iframe class=\"eduUrlFrame\" [src]=sanitizedUrl allowfullscreen=\"\" allow=\"autoplay; fullscreen\" ></iframe>\n </ng-container>\n\n </div>\n <div *ngIf=\"!gdprOk\">\n {{ 'RENDERING.GDPR.GDPR_DIALOG' | translate }}\n <button mat-button (click)=\"consentToGdprWarning()\">{{'RENDERING.GDPR.GDPR_CONTINUE' | translate}}</button>\n </div>\n</div>\n","import {Component, Input, OnInit} from '@angular/core';\nimport {RenderingModule} from '../../rendering.module';\nimport {RenderModule} from '../RenderModule';\nimport {Node} from 'ngx-edu-sharing-api';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {RenderData} from '../../dto/RenderData';\nimport {DomSanitizer, SafeResourceUrl} from '@angular/platform-browser';\n\n@Component({\n selector: 'rs-module-edu-html',\n standalone: true,\n imports: [\n RenderingModule,\n MatButtonModule,\n MatIconModule,\n ],\n templateUrl: './eduHtml.component.html',\n styleUrl: './eduHtml.component.scss'\n})\nexport class EduHtmlComponent implements RenderModule, OnInit {\n @Input() data: RenderData | undefined\n @Input() node: Node | undefined\n sanitizedUrl: SafeResourceUrl = new class implements SafeResourceUrl {\n }\n\n constructor(private sanitizer: DomSanitizer) {\n }\n\n ngOnInit() {\n if (this.data?.items !== undefined && this.data.items[0].link) {\n this.sanitizedUrl = this.getSafeUri()\n }\n }\n\n getSafeUri() {\n if (this.data?.items !== undefined && this.data.items[0].link) {\n const uri = new URL(this.data.items[0].link)\n /**\n if (uri.hostname.includes('nip.io')) {\n uri.hostname = 'localhost'\n }\n */\n return this.sanitizer.bypassSecurityTrustResourceUrl(uri.toString())\n }\n return new class implements SafeResourceUrl {\n }\n }\n}\n","<div class=\"eduHtml-wrapper\" *ngIf=\"data?.items !== undefined\">\n <iframe class=\"frame\" [src]=\"sanitizedUrl\"></iframe>\n</div>\n","import {NgModule} from '@angular/core';\n\n@NgModule({\n imports: []\n})\nexport class RenderingApiModule {}\n","import {Injectable} from '@angular/core';\nimport {ModuleInfoControllerService} from 'ngx-rendering-service-api';\nimport {firstValueFrom} from 'rxjs';\nimport {Node, RestConstants} from 'ngx-edu-sharing-api';\nimport {FrontendModuleConfig, UrlEmbeddings, UrlModuleConfig} from './lib/dto/FrontendModuleConfig';\n\n@Injectable({providedIn: 'root'})\nexport class ModuleInfoService {\n\n private availableMediaTypes: String[] = []\n private availableMimeTypes: String[] = []\n private availableMimeTypePrefixes: String[] = []\n private availableReplicationSources: String[] = []\n private availableResourceTypes: String[] = []\n private availableRemoteRepositories: String[] = []\n\n constructor(\n private service: ModuleInfoControllerService\n ) {}\n\n async isAvailableBackendObject(node: Node| undefined): Promise<boolean> {\n if (!this.isInitialized()) {\n const result = await firstValueFrom(this.service.getModulesInfo({repoId: node?.ref.repo ?? ''}))\n result.forEach(info => {\n if (info.typeMapping.type !== undefined && info.typeMapping.type !== null) {\n this.availableMediaTypes.push(info.typeMapping.type)\n } else if (info.typeMapping.remoteRepositoryType !== undefined && info.typeMapping.remoteRepositoryType !== null) {\n this.availableRemoteRepositories.push(info.typeMapping.remoteRepositoryType)\n } else if(info.typeMapping.resourceType !== undefined && info.typeMapping.resourceType !== null) {\n this.availableResourceTypes.push(info.typeMapping.resourceType)\n } else if(info.typeMapping.replicationSource !== undefined && info.typeMapping.replicationSource !== null) {\n this.availableReplicationSources.push(info.typeMapping.replicationSource)\n } else if (info.typeMapping.mimeTypeSuffix !== undefined\n && info.typeMapping.mimeTypeSuffix !== null\n && info.typeMapping.mimeTypePrefix !== undefined\n && info.typeMapping.mimeTypePrefix !== null\n ) {\n this.availableMimeTypes.push(`${info.typeMapping.mimeTypePrefix}/${info.typeMapping.mimeTypeSuffix}`)\n } else if (info.typeMapping.mimeTypePrefix !== undefined && info.typeMapping.mimeTypePrefix !== null) {\n this.availableMimeTypePrefixes.push(info.typeMapping.mimeTypePrefix)\n }\n })\n }\n const mimeTypePrefix = (node?.mimetype ?? '').split('/', 2)[0]\n return this.availableMediaTypes.includes(node?.mediatype ?? '') ||\n this.availableRemoteRepositories.includes(node?.remote?.repository?.repositoryType ?? '') ||\n this.availableReplicationSources.includes(node?.properties?.[RestConstants.CCM_PROP_REPLICATIONSOURCE]?.[0]?? '') ||\n this.availableResourceTypes.includes(node?.properties?.[RestConstants.CCM_PROP_CCRESSOURCETYPE]?.[0]?? '') ||\n this.availableMimeTypes.includes(node?.mimetype ?? '') ||\n this.availableMimeTypePrefixes.includes(mimeTypePrefix)\n }\n\n private isInitialized(): boolean {\n return this.availableMediaTypes.length\n + this.availableMimeTypes.length\n + this.availableMimeTypePrefixes.length\n + this.availableReplicationSources.length\n + this.availableResourceTypes.length\n + this.availableRemoteRepositories.length !== 0\n }\n\n getFrontendModuleSetting(node: Node): FrontendModuleConfig {\n const urlModuleConfig = this.checkUrlModule(node)\n if (urlModuleConfig !== null) {\n return urlModuleConfig\n }\n return {\n module: 'default',\n urlModuleConfig: null\n }\n }\n\n checkUrlModule(node: Node): FrontendModuleConfig | null {\n const url = node.properties?.['ccm:wwwurl']?.[0] || ''\n const checkLearningApps = (): UrlModuleConfig | null => {\n if (node.remote?.repository?.repositoryType?.toLowerCase() === 'learningapps') {\n return {\n embedding: UrlEmbeddings.LEARNINGAPPS,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function checkYouTube\n */\n const checkYouTube = (): UrlModuleConfig | null => {\n if (node.remote?.repository?.repositoryType?.toLowerCase() === 'youtube') {\n return {\n embedding: UrlEmbeddings.YOUTUBE,\n externalId: node.remote?.id ?? ''\n }\n }\n if (url.includes('youtu.be') ) {\n const split = url.split('/')\n return {\n embedding: UrlEmbeddings.YOUTUBE,\n externalId: split[split.length - 1]\n }\n }\n if (url.includes('.youtube.com/watch?')) {\n const urlObject = new URL(url)\n return {\n embedding: UrlEmbeddings.YOUTUBE,\n externalId: urlObject.searchParams.get('v') ?? ''\n }\n }\n return null\n }\n /**\n * Function checkVimeo\n */\n const checkVimeo = (): UrlModuleConfig | null => {\n if (url.includes('vimeo.com')) {\n const split = url.split('/')\n return {\n embedding: UrlEmbeddings.VIMEO,\n externalId: split[split.length - 1]\n }\n }\n return null\n }\n const checkGenericVideo = (): UrlModuleConfig | null => {\n if (url.length > 0 && ['mp4', 'webm'].includes(url.split('.').pop() ?? '')) {\n return {\n embedding: UrlEmbeddings.VIDEO,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function checkAudio\n */\n const checkAudio = (): UrlModuleConfig | null => {\n if (url.length > 0 && node.mimetype?.startsWith('audio')) {\n return {\n embedding: UrlEmbeddings.AUDIO,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function checkLti13ToolObject\n */\n const checkLti13ToolObject = (): UrlModuleConfig | null => {\n if (node.aspects?.includes('ccm:ltitool_node')) {\n return {\n embedding: UrlEmbeddings.LTI13TOOL,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function checkImage\n */\n const checkImage = (): UrlModuleConfig | null => {\n if (node.properties?.['ccm:remoterepositorytype']?.[0] === 'DDB') {\n return null\n }\n if (node.mediatype === 'file-image') {\n return {\n embedding: UrlEmbeddings.IMAGE,\n externalId: ''\n }\n }\n const mimeTypeSplit = node.mimetype?.split('/') ?? []\n if (mimeTypeSplit.length === 2 && ['png', 'jpg', 'jpeg', 'gif'].includes(mimeTypeSplit[1])) {\n return {\n embedding: UrlEmbeddings.IMAGE,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function detectH5P\n */\n const detectH5P = (): UrlModuleConfig | null => {\n if (url.length > 0 && url.includes('h5p.org/h5p/embed')) {\n return {\n embedding: UrlEmbeddings.H5P,\n externalId: ''\n }\n }\n return null\n }\n /**\n * Function detectPrezi\n */\n const detectPrezi = (): UrlModuleConfig | null => {\n if (url.length > 0 &&\n (url.includes('prezi.com/view/') || url.includes('prezi.com/embed/') || url.includes('prezi.com/p/embed'))\n ) {\n return {\n embedding: UrlEmbeddings.PREZI,\n externalId: ''\n }\n }\n return null\n }\n\n /**\n * embedding if applicable to node\n */\n const embedding =\n checkLearningApps()\n ?? checkYouTube()\n ?? checkVimeo()\n ?? checkGenericVideo()\n ?? checkAudio()\n ?? checkImage()\n ?? checkLti13ToolObject()\n ?? detectH5P()\n ?? detectPrezi()\n\n if (embedding !== null) {\n return {\n module: 'url',\n urlModuleConfig: embedding\n }\n }\n return null\n }\n}\n","import {Component, Inject, Input, OnChanges, OnInit, Optional, SimpleChanges} from '@angular/core';\nimport {RenderingModule} from './rendering.module';\nimport {\n JobInfoControllerService,\n JobInfoReply,\n RenderControllerWrapperService,\n RenderDataRequestWithToken,\n RenderDataResponse\n} from 'ngx-rendering-service-api';\nimport {BehaviorSubject, debounceTime, firstValueFrom, interval, Subject, switchMap, takeUntil} from 'rxjs';\nimport {ImageComponent} from './module/image/image.component';\nimport {RenderingApiModule} from './rendering-api.module';\nimport {VideoComponent} from './module/video/video.component';\nimport {MatProgressSpinnerModule} from '@angular/material/progress-spinner';\nimport {EduSharingApiModule, Node, RestConstants} from 'ngx-edu-sharing-api';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {AssetStateItem, RenderData} from './dto/RenderData';\nimport {PdfComponent} from './module/pdf/pdf.component';\nimport {UrlComponent} from './module/url/url.component';\nimport {EduHtmlComponent} from './module/eduhtml/eduHtml.component';\nimport {ModuleInfoService} from '../module-info.service';\nimport {filter} from 'rxjs/operators';\nimport {PlatformLocation} from '@angular/common';\nimport {DefaultComponent} from './module/default/default.component';\nimport {FrontendModuleConfig} from './dto/FrontendModuleConfig';\nimport {AudioComponent} from './module/audio/audio.component';\nimport {BinderComponent} from './module/binder/binder.component';\nimport {DdbComponent} from './module/ddb/ddb.component';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {EduSharingUiCommonModule, EduSharingUiModule} from 'ngx-edu-sharing-ui';\nimport {ErrorComponent} from './module/error/error.component';\nimport {RENDERING_SERVICE_LIB_CONFIG, RenderingServiceLibConfiguration} from '../rendering-service-lib-configuration';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIcon, MatIconModule} from '@angular/material/icon';\nimport {CdkConnectedOverlay, CdkOverlayOrigin} from '@angular/cdk/overlay';\n\n@Component({\n selector: 'rs-root',\n standalone: true,\n imports: [\n RenderingApiModule,\n RenderingModule,\n ImageComponent,\n VideoComponent,\n MatProgressSpinnerModule,\n MatProgressBarModule,\n MatIcon,\n PdfComponent,\n UrlComponent,\n EduHtmlComponent,\n DefaultComponent,\n MatButtonModule,\n AudioComponent,\n BinderComponent,\n DdbComponent,\n EduSharingApiModule,\n EduSharingUiCommonModule,\n ErrorComponent,\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n TranslateModule,\n ],\n providers: [\n TranslateService\n ],\n templateUrl: './render.component.html',\n styleUrl: './render.component.scss'\n})\nexport class RenderComponent implements OnChanges, OnInit {\n @Input() displayMode: 'full' | 'inline' = 'full';\n @Input() request: RenderDataRequestWithToken | undefined;\n @Input() node: Node | undefined;\n @Input() serviceWorkerUrl: string | undefined;\n @Input() activateServiceWorker: boolean = true;\n @Input() assetUrl: string = '';\n @Input() resourceUrl: string = '';\n serviceWorkerReady = false;\n loadData = new Subject<void>();\n renderData$ = new BehaviorSubject<RenderData | null>(null);\n finished = new Subject<void>();\n someButNotAllFinished = new Subject<Boolean>()\n progress$ = new BehaviorSubject<{ module: string, progress?: number } | null>(null);\n showInlineMetadata: boolean = false;\n\n constructor(\n private renderControllerService: RenderControllerWrapperService,\n private jobInfoControllerService: JobInfoControllerService,\n private moduleInfoService: ModuleInfoService,\n private platformLocation: PlatformLocation,\n @Optional() @Inject(RENDERING_SERVICE_LIB_CONFIG) public configuration: RenderingServiceLibConfiguration,\n ) {\n this.loadData.pipe(\n filter(() => this.node !== undefined && this.serviceWorkerReady),\n debounceTime(10),\n switchMap(() => {\n // subscribe error handling\n return this.checkModule()\n })\n ).subscribe({\n next: async (frontendModule) => {\n // No further calls to rs2 necessary if we have a frontend only module\n if (frontendModule !== null) {\n const data: RenderData = {\n module: frontendModule.module,\n frontendModuleConfig: frontendModule\n }\n this.renderData$.next(data)\n this.finished.next()\n } else {\n try {\n const renderResponseData = await firstValueFrom(this.renderControllerService.getRenderDataToken(this.request!!))\n // Case 1: no job returned => no polling needed\n if (renderResponseData.jobId === null) {\n this.handleRenderingResponseWithoutJob(renderResponseData)\n } else {\n this.progress$.next({module: renderResponseData.module ?? ''});\n interval(500).pipe(\n takeUntil(this.finished),\n switchMap(() => this.jobInfoControllerService.getJobInfo({jobId: renderResponseData.jobId!!}).pipe()),\n ).subscribe({\n next: async (jobInfo) => {\n // Some, but not all, jobs are in a final status (this means some are still QUEUED or PROCESSING)\n if (jobInfo.jobs.some(j => j.status === 'FINISHED') && jobInfo.status !== 'FINISHED') {\n this.handleJobInfoWithSubJobsInProgress(renderResponseData, jobInfo)\n // main job finished or partially failed\n } else if (jobInfo.status === 'FINISHED' || jobInfo.status === 'PARTIALLY_FAILED') {\n this.handleFinishedOrPartialJobInfo(renderResponseData, jobInfo)\n // Main job failed => no module but error page\n } else if (jobInfo.status === 'FAILED') {\n this.handleFailedMainJob(jobInfo)\n } else {\n // no finished jobs -> show either one progress bar with race leader (progress 0-100)\n // or queue position (progress (-inf,-1])\n this.handleMainJobWithNoSubJobInFinalStatus(jobInfo)\n }\n },\n error: error => {\n this.handleApiError(error)\n }});\n }\n } catch (error) {\n this.handleApiError(error)\n }\n }\n },\n error: (error) => {\n this.handleApiError(error)\n }\n });\n }\n\n handleApiError(error: any) {\n const publicMessage = error.error.userMessage ?? 'GENERIC_ERROR_MESSAGE'\n const data: RenderData = {\n module: 'ERROR',\n publicErrorMessage: publicMessage\n }\n this.renderData$.next(data)\n this.finished.next()\n }\n\n async ngOnInit() {\n if (this.assetUrl !== '') {\n this.configuration.assetsUrl = this.assetUrl;\n }\n if (!this.activateServiceWorker) {\n this.serviceWorkerReady = true;\n this.loadData.next();\n }\n // await firstValueFrom(this.translationsService.initialize())\n if ('serviceWorker' in navigator) {\n const reg = await navigator.serviceWorker.getRegistrations();\n await Promise.all(reg?.map((r: ServiceWorkerRegistration) => r.unregister()));\n const serviceWorkerUrl = this.serviceWorkerUrl ?? (this.platformLocation.getBaseHrefFromDOM() + 'edu-service-worker.js');\n const scope = this.serviceWorkerUrl ? '/' : this.platformLocation.getBaseHrefFromDOM();\n const registration = await navigator.serviceWorker.register(serviceWorkerUrl, {\n scope: scope\n });\n if (registration.waiting) {\n registration.waiting.postMessage({type: 'SKIP_WAITING'});\n }\n this.serviceWorkerReady = true;\n this.loadData.next();\n registration.onupdatefound = () => {\n const newWorker = registration.installing;\n if (newWorker) {\n newWorker.onstatechange = () => {\n if (newWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n newWorker.postMessage({type: 'SKIP_WAITING'});\n }\n }\n };\n }\n };\n navigator.serviceWorker.addEventListener('controllerchange', () => {\n console.info('Service Worker controlling this page.');\n });\n } else {\n console.warn('Service worker API not available');\n }\n }\n\n async ngOnChanges(_: SimpleChanges) {\n this.loadData.next();\n }\n\n async checkModule(): Promise<FrontendModuleConfig | null> {\n if (!await this.moduleInfoService.isAvailableBackendObject(this.node)) {\n if (this.node !== undefined) {\n return this.moduleInfoService.getFrontendModuleSetting(this.node)\n }\n return {module: 'default', urlModuleConfig: null}\n } else {\n return null\n }\n }\n\n handleRenderingResponseWithoutJob(renderDataResponse: RenderDataResponse) {\n const items = renderDataResponse.objectLinks?.map(item => {\n const assetItem: AssetStateItem = {\n link: item.link,\n progress: 100,\n height: item.height,\n width: item.width,\n additionalData: undefined,\n status: 'FINISHED'\n }\n return assetItem\n })\n const data: RenderData = {\n module: renderDataResponse.module ?? '',\n items: items\n }\n renderDataResponse.objectLinks !== undefined && this.renderData$.next(data);\n this.finished.next();\n }\n\n handleJobInfoWithSubJobsInProgress(renderDataResponse: RenderDataResponse, jobInfo: JobInfoReply) {\n const items = jobInfo.jobs.map(subJob => {\n const assetItem: AssetStateItem = {\n link: subJob.objectLink?.link ?? '',\n progress: subJob.status !== 'QUEUED' ? subJob.progress : -(subJob.progress + 1),\n height: subJob.objectLink?.height ?? subJob.quality,\n width: subJob.objectLink?.width ?? 0,\n additionalData: subJob.additionalData,\n status: subJob.status,\n }\n return assetItem\n })\n const data: RenderData = {\n module: renderDataResponse.module ?? '',\n items: items\n }\n this.renderData$.next(data)\n this.someButNotAllFinished.next(true)\n }\n\n handleFinishedOrPartialJobInfo(renderDataResponse: RenderDataResponse, jobInfo: JobInfoReply) {\n const items = jobInfo.jobs.map(subJob => {\n const assetItem: AssetStateItem = {\n link: subJob.objectLink?.link ?? '',\n progress: subJob.progress,\n height: subJob.objectLink?.height ?? subJob.quality,\n width: subJob.objectLink?.width ?? 0,\n additionalData: subJob.additionalData,\n publicErrorMessage: subJob.publicErrorMessage,\n status:subJob.status,\n }\n return assetItem\n })\n const data: RenderData = {\n module: renderDataResponse.module ?? '',\n items: items\n }\n this.renderData$.next(data)\n this.finished.next()\n }\n\n handleFailedMainJob(jobInfo: JobInfoReply) {\n const data: RenderData = {\n module: 'ERROR',\n publicErrorMessage: jobInfo.userMessage ?? 'GENERIC_ERROR_MESSAGE'\n }\n this.renderData$.next(data)\n this.finished.next()\n }\n\n handleMainJobWithNoSubJobInFinalStatus(jobInfo: JobInfoReply) {\n let progress = 0\n if (jobInfo.jobs.some(j => j.status === 'PROCESSING')) {\n progress = Math.max(...jobInfo.jobs.map(j => j.progress))\n } else if (jobInfo.jobs.some(j => j.status === 'QUEUED')) {\n progress = -(Math.min(...jobInfo.jobs.map(j => j.progress + 1)))\n }\n this.progress$.next({\n module: jobInfo.module ?? '',\n progress: progress\n });\n }\n\n getAuthors(): string {\n console.info(\"Getting authors\")\n if (this.node?.properties !== undefined) {\n console.info(\"Props != undefined\");\n\n const freeText = (this.node.properties['ccm:author_freetext'] ?? []).join(', ').trim();\n console.info(\"FREETEXT: \" + freeText);\n\n const authors = (this.node.properties['ccm:lifecyclecontributer_authorFN'] ?? []).join(', ').trim();\n console.info(\"AUTHORS: \" + authors);\n\n const orgs = (this.node.properties['ccm:lifecyclecontributer_authorVCARD_ORG'] ?? []).join(', ').trim();\n console.info(\"ORGS: \" + orgs);\n\n return authors + (orgs ? ', ' + orgs : '') + (freeText ? ', ' + freeText : '');\n }\n return \"\"\n }\n}\n","<div class=\"module module-{{(renderData$ | async)?.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'){\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' || data?.module === 'H5P' || data?.module === 'JUPYTER' || data.module === 'SPREADSHEET') {\n <rs-module-edu-html [data]=\"data\" [node]=\"node\"></rs-module-edu-html>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'AUDIO'){\n <rs-module-audio [data]=\"data\" [node]=\"node\"></rs-module-audio>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'BINDER'){\n <rs-module-binder [data]=\"data\" [node]=\"node\"></rs-module-binder>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'DDB'){\n <rs-module-ddb [data]=\"data\" [node]=\"node\"></rs-module-ddb>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n <ng-container *ngIf=\"data.module === 'default'\">\n @defer (when data.module === 'default') {\n <rs-module-default [node]=\"node\"></rs-module-default>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'url'\">\n @defer (when data.module === 'url') {\n <rs-module-url [node]=\"node\" [data]=\"data\"></rs-module-url>\n }\n </ng-container>\n <ng-container *ngIf=\"data.module === 'ERROR'\">\n @defer (when data.module === 'ERROR') {\n <rs-module-error [node]=\"node\" [data]=\"data\"></rs-module-error>\n }\n </ng-container>\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 class=\"inline-metadata\" *ngIf=\"displayMode === 'inline' && node\">\n <div>\n <a [href]=\"resourceUrl\">{{ node.title || node.name }}</a> {{ 'RENDERING.AUTHORED_BY' | translate }} {{getAuthors()}}\n <ng-container *ngIf=\"node.license as license\">\n <ng-container *ngIf=\"license.url; else noLink\">\n <a [href]=\"license.url\" target=\"_blank\" rel=\"noopener\">\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </a>\n </ng-container>\n <ng-template #noLink>\n <img [src]=\"license.icon\" alt=\"License icon\"/>\n </ng-template>\n </ng-container>\n </div>\n <button mat-icon-button color=\"primary\"\n (click)=\"showInlineMetadata = !showInlineMetadata\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n ><i esIcon=\"info_outline\"></i></button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showInlineMetadata\"\n [cdkConnectedOverlayMinWidth]=\"300\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayHeight]=\"300\"\n (backdropClick)=\"showInlineMetadata = false\"\n (detach)=\"showInlineMetadata = false\"\n >\n <div class=\"inline-metadata-panel\">\n <es-mds-viewer\n groupId=\"io_render_inline\"\n [data]=\"node.properties!!\"\n ></es-mds-viewer>\n </div>\n </ng-template>\n </div>\n</div>\n\n<ng-template #loading>\n <div class=\"progress\">\n <mat-spinner></mat-spinner>\n </div>\n</ng-template>\n","import {ModuleWithProviders, NgModule} from '@angular/core';\nimport {RenderComponent} from './lib/render.component';\nimport {CommonModule} from '@angular/common';\nimport {EduSharingUiConfigurationParams} from 'ngx-edu-sharing-ui/lib/edu-sharing-ui-configuration';\nimport {getConfigProvider, RenderingServiceLibConfigurationParams} from './rendering-service-lib-configuration';\n\n@NgModule({\n declarations: [],\n imports: [\n RenderComponent,\n CommonModule,\n ],\n exports: [\n CommonModule,\n RenderComponent,\n ],\n})\nexport class RenderingServiceLibModule {\n public static forRoot(\n params: RenderingServiceLibConfigurationParams\n): ModuleWithProviders<RenderingServiceLibModule> {\n return {\n ngModule: RenderingServiceLibModule,\n providers: [getConfigProvider(params)]\n };\n }\n}\n","/*\n * Public API Surface of edu-sharing-ui\n */\n\nexport * from './lib/rendering.module';\nexport * from './lib/module/image/image.component';\nexport * from './lib/module/video/video.component';\nexport * from './lib/module/pdf/pdf.component';\nexport * from './lib/module/url/url.component';\nexport * from './lib/module/eduhtml/eduHtml.component';\nexport * from './lib/render.component';\nexport * from './lib/asset-link.pipe';\nexport * from './rendering-service-lib.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.AssetLinkPipe","i3","i4","i2","i6","i7","i8"],"mappings":"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"}
@@ -20,6 +20,7 @@ export declare class RenderComponent implements OnChanges, OnInit {
20
20
  serviceWorkerUrl: string | undefined;
21
21
  activateServiceWorker: boolean;
22
22
  assetUrl: string;
23
+ resourceUrl: string;
23
24
  serviceWorkerReady: boolean;
24
25
  loadData: Subject<void>;
25
26
  renderData$: BehaviorSubject<RenderData | null>;
@@ -40,6 +41,7 @@ export declare class RenderComponent implements OnChanges, OnInit {
40
41
  handleFinishedOrPartialJobInfo(renderDataResponse: RenderDataResponse, jobInfo: JobInfoReply): void;
41
42
  handleFailedMainJob(jobInfo: JobInfoReply): void;
42
43
  handleMainJobWithNoSubJobInFinalStatus(jobInfo: JobInfoReply): void;
44
+ getAuthors(): string;
43
45
  static ɵfac: i0.ɵɵFactoryDeclaration<RenderComponent, [null, null, null, null, { optional: true; }]>;
44
- static ɵcmp: i0.ɵɵComponentDeclaration<RenderComponent, "rs-root", never, { "displayMode": { "alias": "displayMode"; "required": false; }; "request": { "alias": "request"; "required": false; }; "node": { "alias": "node"; "required": false; }; "serviceWorkerUrl": { "alias": "serviceWorkerUrl"; "required": false; }; "activateServiceWorker": { "alias": "activateServiceWorker"; "required": false; }; "assetUrl": { "alias": "assetUrl"; "required": false; }; }, {}, never, never, true, never>;
46
+ static ɵcmp: i0.ɵɵComponentDeclaration<RenderComponent, "rs-root", never, { "displayMode": { "alias": "displayMode"; "required": false; }; "request": { "alias": "request"; "required": false; }; "node": { "alias": "node"; "required": false; }; "serviceWorkerUrl": { "alias": "serviceWorkerUrl"; "required": false; }; "activateServiceWorker": { "alias": "activateServiceWorker"; "required": false; }; "assetUrl": { "alias": "assetUrl"; "required": false; }; "resourceUrl": { "alias": "resourceUrl"; "required": false; }; }, {}, never, never, true, never>;
45
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-rendering-service-lib",
3
- "version": "0.0.66873",
3
+ "version": "0.0.66875",
4
4
  "private": false,
5
5
  "dependencies": {
6
6
  "tslib": "^2.3.0"