@worktile/planet 19.0.0-next.0 → 19.0.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/assets-loader.d.ts +9 -4
  3. package/assets-loader.d.ts.map +1 -1
  4. package/esm2022/application/ng-planet-application-ref.mjs +116 -0
  5. package/esm2022/application/planet-application-loader.mjs +459 -0
  6. package/esm2022/application/planet-application-ref.mjs +2 -0
  7. package/esm2022/application/planet-application.service.mjs +86 -0
  8. package/esm2022/application/portal-application.mjs +25 -0
  9. package/esm2022/assets-loader.mjs +332 -0
  10. package/esm2022/component/planet-component-loader.mjs +213 -0
  11. package/esm2022/component/planet-component-outlet.mjs +72 -0
  12. package/esm2022/component/planet-component-types.mjs +3 -0
  13. package/esm2022/component/plant-component.config.mjs +7 -0
  14. package/esm2022/debug.mjs +33 -0
  15. package/esm2022/empty/empty.component.mjs +17 -0
  16. package/esm2022/global-event-dispatcher.mjs +70 -0
  17. package/esm2022/global-planet.mjs +63 -0
  18. package/esm2022/helpers.mjs +187 -0
  19. package/esm2022/inner-types.mjs +2 -0
  20. package/esm2022/module.mjs +33 -0
  21. package/esm2022/planet.class.mjs +9 -0
  22. package/esm2022/planet.mjs +97 -0
  23. package/esm2022/public-api.mjs +19 -0
  24. package/esm2022/router/route-redirect.mjs +63 -0
  25. package/esm2022/sandbox/constants.mjs +7 -0
  26. package/esm2022/sandbox/exec.mjs +15 -0
  27. package/esm2022/sandbox/index.mjs +20 -0
  28. package/esm2022/sandbox/proxy/patches/document.mjs +12 -0
  29. package/esm2022/sandbox/proxy/patches/eventListener.mjs +41 -0
  30. package/esm2022/sandbox/proxy/patches/index.mjs +11 -0
  31. package/esm2022/sandbox/proxy/patches/storage.mjs +40 -0
  32. package/esm2022/sandbox/proxy/patches/timer.mjs +43 -0
  33. package/esm2022/sandbox/proxy/proxies/common.mjs +132 -0
  34. package/esm2022/sandbox/proxy/proxies/document.mjs +126 -0
  35. package/esm2022/sandbox/proxy/proxies/window.mjs +158 -0
  36. package/esm2022/sandbox/proxy/proxy-sandbox.mjs +49 -0
  37. package/esm2022/sandbox/proxy/types.mjs +2 -0
  38. package/esm2022/sandbox/sandbox.mjs +7 -0
  39. package/esm2022/sandbox/snapshot/snapshot-sandbox.mjs +12 -0
  40. package/esm2022/sandbox/types.mjs +2 -0
  41. package/esm2022/worktile-planet.mjs +5 -0
  42. package/fesm2022/worktile-planet.mjs +81 -51
  43. package/fesm2022/worktile-planet.mjs.map +1 -1
  44. package/helpers.d.ts +1 -1
  45. package/helpers.d.ts.map +1 -1
  46. package/inner-types.d.ts +6 -3
  47. package/inner-types.d.ts.map +1 -1
  48. package/package.json +3 -1
@@ -0,0 +1,86 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { shareReplay, map } from 'rxjs/operators';
4
+ import { coerceArray } from '../helpers';
5
+ import { AssetsLoader } from '../assets-loader';
6
+ import { getApplicationService } from '../global-planet';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ import * as i2 from "../assets-loader";
10
+ export class PlanetApplicationService {
11
+ constructor(http, assetsLoader) {
12
+ this.http = http;
13
+ this.assetsLoader = assetsLoader;
14
+ this.apps = [];
15
+ this.appsMap = {};
16
+ if (getApplicationService()) {
17
+ throw new Error('PlanetApplicationService has been injected in the portal, repeated injection is not allowed');
18
+ }
19
+ }
20
+ register(appOrApps) {
21
+ const apps = coerceArray(appOrApps);
22
+ apps.forEach(app => {
23
+ if (this.appsMap[app.name]) {
24
+ throw new Error(`${app.name} has be registered.`);
25
+ }
26
+ this.apps.push(app);
27
+ this.appsMap[app.name] = app;
28
+ });
29
+ }
30
+ registerByUrl(url) {
31
+ const result = this.http.get(`${url}`).pipe(map(apps => {
32
+ if (apps && Array.isArray(apps)) {
33
+ this.register(apps);
34
+ }
35
+ else {
36
+ this.register(apps);
37
+ }
38
+ }), shareReplay());
39
+ result.subscribe();
40
+ return result;
41
+ }
42
+ unregister(name) {
43
+ if (this.appsMap[name]) {
44
+ delete this.appsMap[name];
45
+ this.apps = this.apps.filter(app => {
46
+ return app.name !== name;
47
+ });
48
+ }
49
+ }
50
+ getAppsByMatchedUrl(url) {
51
+ return this.getApps().filter(app => {
52
+ if (app.routerPathPrefix instanceof RegExp) {
53
+ return app.routerPathPrefix.test(url);
54
+ }
55
+ else {
56
+ return (url === app.routerPathPrefix ||
57
+ (url.startsWith(app.routerPathPrefix) && ['/', '?'].includes(url[app.routerPathPrefix.length])));
58
+ }
59
+ });
60
+ }
61
+ getAppByName(name) {
62
+ return this.appsMap[name];
63
+ }
64
+ getAppsToPreload(excludeAppNames) {
65
+ return this.getApps().filter(app => {
66
+ if (excludeAppNames) {
67
+ return app.preload && !excludeAppNames.includes(app.name);
68
+ }
69
+ else {
70
+ return app.preload;
71
+ }
72
+ });
73
+ }
74
+ getApps() {
75
+ return this.apps;
76
+ }
77
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PlanetApplicationService, deps: [{ token: i1.HttpClient }, { token: i2.AssetsLoader }], target: i0.ɵɵFactoryTarget.Injectable }); }
78
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PlanetApplicationService, providedIn: 'root' }); }
79
+ }
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PlanetApplicationService, decorators: [{
81
+ type: Injectable,
82
+ args: [{
83
+ providedIn: 'root'
84
+ }]
85
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.AssetsLoader }] });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbmV0LWFwcGxpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGFuZXQvc3JjL2FwcGxpY2F0aW9uL3BsYW5ldC1hcHBsaWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFLekQsTUFBTSxPQUFPLHdCQUF3QjtJQUtqQyxZQUNZLElBQWdCLEVBQ2hCLFlBQTBCO1FBRDFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFOOUIsU0FBSSxHQUF3QixFQUFFLENBQUM7UUFFL0IsWUFBTyxHQUF5QyxFQUFFLENBQUM7UUFNdkQsSUFBSSxxQkFBcUIsRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2RkFBNkYsQ0FBQyxDQUFDO1FBQ25ILENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUFTLFNBQWtFO1FBQy9FLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLEdB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cEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFuZXRBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3BsYW5ldC5jbGFzcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgc2hhcmVSZXBsYXksIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBc3NldHNMb2FkZXIgfSBmcm9tICcuLi9hc3NldHMtbG9hZGVyJztcbmltcG9ydCB7IGdldEFwcGxpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL2dsb2JhbC1wbGFuZXQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBsYW5ldEFwcGxpY2F0aW9uU2VydmljZSB7XG4gICAgcHJpdmF0ZSBhcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdID0gW107XG5cbiAgICBwcml2YXRlIGFwcHNNYXA6IHsgW2tleTogc3RyaW5nXTogUGxhbmV0QXBwbGljYXRpb24gfSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgcHJpdmF0ZSBhc3NldHNMb2FkZXI6IEFzc2V0c0xvYWRlclxuICAgICkge1xuICAgICAgICBpZiAoZ2V0QXBwbGljYXRpb25TZXJ2aWNlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxhbmV0QXBwbGljYXRpb25TZXJ2aWNlIGhhcyBiZWVuIGluamVjdGVkIGluIHRoZSBwb3J0YWwsIHJlcGVhdGVkIGluamVjdGlvbiBpcyBub3QgYWxsb3dlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXI8VEV4dHJhPihhcHBPckFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uPFRFeHRyYT4gfCBQbGFuZXRBcHBsaWNhdGlvbjxURXh0cmE+W10pIHtcbiAgICAgICAgY29uc3QgYXBwcyA9IGNvZXJjZUFycmF5KGFwcE9yQXBwcyk7XG4gICAgICAgIGFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXBwc01hcFthcHAubmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YXBwLm5hbWV9IGhhcyBiZSByZWdpc3RlcmVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcHBzLnB1c2goYXBwKTtcbiAgICAgICAgICAgIHRoaXMuYXBwc01hcFthcHAubmFtZV0gPSBhcHA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyQnlVcmwodXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5odHRwLmdldChgJHt1cmx9YCkucGlwZShcbiAgICAgICAgICAgIG1hcChhcHBzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXBwcyAmJiBBcnJheS5pc0FycmF5KGFwcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoYXBwcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihhcHBzIGFzIFBsYW5ldEFwcGxpY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KClcbiAgICAgICAgKTtcbiAgICAgICAgcmVzdWx0LnN1YnNjcmliZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHVucmVnaXN0ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmFwcHNNYXBbbmFtZV0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFwcHNNYXBbbmFtZV07XG4gICAgICAgICAgICB0aGlzLmFwcHMgPSB0aGlzLmFwcHMuZmlsdGVyKGFwcCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcC5uYW1lICE9PSBuYW1lO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBcHBzQnlNYXRjaGVkVXJsPFRFeHRyYSA9IHVua25vd24+KHVybDogc3RyaW5nKTogUGxhbmV0QXBwbGljYXRpb248VEV4dHJhPltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXBwcygpLmZpbHRlcihhcHAgPT4ge1xuICAgICAgICAgICAgaWYgKGFwcC5yb3V0ZXJQYXRoUHJlZml4IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcC5yb3V0ZXJQYXRoUHJlZml4LnRlc3QodXJsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgdXJsID09PSBhcHAucm91dGVyUGF0aFByZWZpeCB8fFxuICAgICAgICAgICAgICAgICAgICAodXJsLnN0YXJ0c1dpdGgoYXBwLnJvdXRlclBhdGhQcmVmaXgpICYmIFsnLycsICc/J10uaW5jbHVkZXModXJsW2FwcC5yb3V0ZXJQYXRoUHJlZml4Lmxlbmd0aF0pKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEFwcEJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwc01hcFtuYW1lXTtcbiAgICB9XG5cbiAgICBnZXRBcHBzVG9QcmVsb2FkKGV4Y2x1ZGVBcHBOYW1lcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFwcHMoKS5maWx0ZXIoYXBwID0+IHtcbiAgICAgICAgICAgIGlmIChleGNsdWRlQXBwTmFtZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwLnByZWxvYWQgJiYgIWV4Y2x1ZGVBcHBOYW1lcy5pbmNsdWRlcyhhcHAubmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHAucHJlbG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QXBwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwcztcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,25 @@
1
+ export class PlanetPortalApplication {
2
+ constructor() {
3
+ this.name = 'portal';
4
+ }
5
+ navigateByUrl(url, extras) {
6
+ return this.ngZone.run(() => {
7
+ return this.router.navigateByUrl(url, extras);
8
+ });
9
+ }
10
+ run(fn) {
11
+ return this.ngZone.run(() => {
12
+ return fn();
13
+ });
14
+ }
15
+ tick() {
16
+ this.applicationRef.tick();
17
+ }
18
+ getComponentFactory() {
19
+ return this.componentFactory;
20
+ }
21
+ registerComponentFactory(componentFactory) {
22
+ this.componentFactory = componentFactory;
23
+ }
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLWFwcGxpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvcGxhbmV0L3NyYy9hcHBsaWNhdGlvbi9wb3J0YWwtYXBwbGljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxPQUFPLHVCQUF1QjtJQUFwQztRQU9JLFNBQUksR0FBWSxRQUFRLENBQUM7SUEwQjdCLENBQUM7SUF2QkcsYUFBYSxDQUFDLEdBQXFCLEVBQUUsTUFBeUI7UUFDMUQsT0FBTyxJQUFJLENBQUMsTUFBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUMsTUFBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsR0FBRyxDQUFJLEVBQXlCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLE1BQU8sQ0FBQyxHQUFHLENBQUksR0FBRyxFQUFFO1lBQzVCLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSTtRQUNBLElBQUksQ0FBQyxjQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELG1CQUFtQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxnQkFBdUM7UUFDNUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzdDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlciwgVXJsVHJlZSwgTmF2aWdhdGlvbkV4dHJhcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOZ1pvbmUsIEluamVjdG9yLCBBcHBsaWNhdGlvblJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGxhbnRDb21wb25lbnRGYWN0b3J5IH0gZnJvbSAnLi4vY29tcG9uZW50L3BsYW5ldC1jb21wb25lbnQtdHlwZXMnO1xuaW1wb3J0IHsgR2xvYmFsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vZ2xvYmFsLWV2ZW50LWRpc3BhdGNoZXInO1xuXG5leHBvcnQgY2xhc3MgUGxhbmV0UG9ydGFsQXBwbGljYXRpb248VERhdGEgPSBhbnk+IHtcbiAgICBhcHBsaWNhdGlvblJlZj86IEFwcGxpY2F0aW9uUmVmO1xuICAgIGluamVjdG9yPzogSW5qZWN0b3I7XG4gICAgcm91dGVyPzogUm91dGVyO1xuICAgIG5nWm9uZT86IE5nWm9uZTtcbiAgICBnbG9iYWxFdmVudERpc3BhdGNoZXI/OiBHbG9iYWxFdmVudERpc3BhdGNoZXI7XG4gICAgZGF0YT86IFREYXRhO1xuICAgIG5hbWU/OiBzdHJpbmcgPSAncG9ydGFsJztcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3Rvcnk/OiBQbGFudENvbXBvbmVudEZhY3Rvcnk7XG5cbiAgICBuYXZpZ2F0ZUJ5VXJsKHVybDogc3RyaW5nIHwgVXJsVHJlZSwgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUhLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIhLm5hdmlnYXRlQnlVcmwodXJsLCBleHRyYXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBydW48VD4oZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gVCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUhLnJ1bjxUPigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGljaygpIHtcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZiEudGljaygpO1xuICAgIH1cblxuICAgIGdldENvbXBvbmVudEZhY3RvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEZhY3Rvcnk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudEZhY3Rvcnk6IFBsYW50Q29tcG9uZW50RmFjdG9yeSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnkgPSBjb21wb25lbnRGYWN0b3J5O1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,332 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { hashCode, isEmpty, getResourceFileName, getExtName, isObject, getAssetsBasePath, getScriptsAndStylesAssets } from './helpers';
3
+ import { of, Observable, forkJoin, concat } from 'rxjs';
4
+ import { map, switchMap, concatAll } from 'rxjs/operators';
5
+ import { HttpClient } from '@angular/common/http';
6
+ import { createSandbox } from './sandbox';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ const STYLE_LINK_OR_SCRIPT_REG = /<[script|link].*?>/gi;
10
+ const LINK_OR_SRC_REG = /(src|href)=["'](.*?[\.js|\.css])["']/i;
11
+ const TAG_ATTRS_REG = /(type|defer|async|rel)((=["'].*?["'])|\s|\>)/gi;
12
+ export class AssetsLoader {
13
+ constructor(http) {
14
+ this.http = http;
15
+ this.loadedSources = [];
16
+ }
17
+ loadScript(scriptAsset) {
18
+ const { src, tagName, attributes: tagAttributes } = scriptAsset;
19
+ const id = hashCode(src);
20
+ if (this.loadedSources.includes(id)) {
21
+ return of({
22
+ src: src,
23
+ hashCode: id,
24
+ loaded: true,
25
+ status: 'Loaded'
26
+ });
27
+ }
28
+ if (tagName === 'link') {
29
+ const LinkAttributes = tagAttributes;
30
+ const link = document.createElement('link');
31
+ link.href = src;
32
+ if (LinkAttributes.rel) {
33
+ link.rel = LinkAttributes.rel;
34
+ }
35
+ const head = document.getElementsByTagName('head')[0];
36
+ head.appendChild(link);
37
+ return of({
38
+ src: src,
39
+ hashCode: id,
40
+ loaded: false,
41
+ status: 'Preload'
42
+ });
43
+ }
44
+ return new Observable((observer) => {
45
+ const scriptAttributes = tagAttributes;
46
+ const script = document.createElement('script');
47
+ script.type = scriptAttributes?.type || 'text/javascript';
48
+ script.src = src;
49
+ if (!scriptAttributes?.defer || scriptAttributes?.defer !== 'false') {
50
+ script.defer = true;
51
+ }
52
+ if (!scriptAttributes?.async && scriptAttributes?.async !== 'false') {
53
+ script.async = true;
54
+ }
55
+ if (script['readyState']) {
56
+ // IE
57
+ script['onreadystatechange'] = () => {
58
+ if (script['readyState'] === 'loaded' || script['readyState'] === 'complete') {
59
+ script['onreadystatechange'] = null;
60
+ observer.next({
61
+ src: src,
62
+ hashCode: id,
63
+ loaded: true,
64
+ status: 'Loaded'
65
+ });
66
+ observer.complete();
67
+ this.loadedSources.push(id);
68
+ }
69
+ };
70
+ }
71
+ else {
72
+ // Others
73
+ script.onload = () => {
74
+ observer.next({
75
+ src: src,
76
+ hashCode: id,
77
+ loaded: true,
78
+ status: 'Loaded'
79
+ });
80
+ observer.complete();
81
+ this.loadedSources.push(id);
82
+ };
83
+ }
84
+ script.onerror = error => {
85
+ observer.error({
86
+ src: src,
87
+ hashCode: id,
88
+ loaded: false,
89
+ status: 'Error',
90
+ error: error
91
+ });
92
+ observer.complete();
93
+ };
94
+ document.body.appendChild(script);
95
+ });
96
+ }
97
+ loadScriptWithSandbox(app, src) {
98
+ const id = hashCode(src);
99
+ if (this.loadedSources.includes(id)) {
100
+ return of({
101
+ src: src,
102
+ hashCode: id,
103
+ loaded: true,
104
+ status: 'Loaded'
105
+ });
106
+ }
107
+ return new Observable((observer) => {
108
+ this.http.get(src, { responseType: 'text' }).subscribe((code) => {
109
+ this.loadedSources.push(id);
110
+ const sandbox = createSandbox(app);
111
+ sandbox.execScript(code, src);
112
+ observer.next({
113
+ src: src,
114
+ hashCode: id,
115
+ loaded: true,
116
+ status: 'Loaded'
117
+ });
118
+ observer.complete();
119
+ }, error => {
120
+ observer.error({
121
+ src: src,
122
+ hashCode: id,
123
+ loaded: false,
124
+ status: 'Error',
125
+ error: error
126
+ });
127
+ observer.complete();
128
+ });
129
+ });
130
+ }
131
+ loadStyle(src) {
132
+ const id = hashCode(src);
133
+ if (this.loadedSources.includes(id)) {
134
+ return of({
135
+ src: src,
136
+ hashCode: id,
137
+ loaded: true,
138
+ status: 'Loaded'
139
+ });
140
+ }
141
+ return new Observable((observer) => {
142
+ const head = document.getElementsByTagName('head')[0];
143
+ const link = document.createElement('link');
144
+ link.rel = 'stylesheet';
145
+ link.type = 'text/css';
146
+ link.href = src;
147
+ link.media = 'all';
148
+ link.onload = () => {
149
+ observer.next({
150
+ src: src,
151
+ hashCode: id,
152
+ loaded: true,
153
+ status: 'Loaded'
154
+ });
155
+ observer.complete();
156
+ this.loadedSources.push(id);
157
+ };
158
+ link.onerror = error => {
159
+ observer.error({
160
+ src: src,
161
+ hashCode: id,
162
+ loaded: true,
163
+ status: 'Loaded',
164
+ error: error
165
+ });
166
+ observer.complete();
167
+ };
168
+ head.appendChild(link);
169
+ });
170
+ }
171
+ loadScripts(sources, options = {
172
+ serial: false,
173
+ sandbox: false
174
+ }) {
175
+ if (isEmpty(sources)) {
176
+ return of(null);
177
+ }
178
+ const observables = sources.map(source => {
179
+ // TODO: 暂时只支持Proxy沙箱
180
+ if (options.sandbox && window.Proxy) {
181
+ return this.loadScriptWithSandbox(options.app, source.src);
182
+ }
183
+ else {
184
+ return this.loadScript(source);
185
+ }
186
+ });
187
+ if (options.serial) {
188
+ const a = concat(...observables).pipe(map(item => {
189
+ return of([item]);
190
+ }), concatAll());
191
+ return a;
192
+ }
193
+ else {
194
+ return forkJoin(observables).pipe();
195
+ }
196
+ }
197
+ loadStyles(sources) {
198
+ if (isEmpty(sources)) {
199
+ return of(null);
200
+ }
201
+ return forkJoin(sources.map(source => {
202
+ return this.loadStyle(source.src);
203
+ }));
204
+ }
205
+ loadScriptsAndStyles(scripts = [], styles = [], options) {
206
+ return forkJoin([this.loadScripts(scripts, options), this.loadStyles(styles)]);
207
+ }
208
+ /**
209
+ * <script type="module" src="http://127.0.0.1:3001/main.js" async defer></script>
210
+ * => [`type="module"`, "async ", "defer>"] as attributeStrMatchArr
211
+ * => { type: "module", async: "async", defer: "defer" } as attributes
212
+ */
213
+ parseTagAttributes(tag) {
214
+ const attributeStrMatchArr = tag.match(TAG_ATTRS_REG);
215
+ if (attributeStrMatchArr) {
216
+ const attributes = {};
217
+ attributeStrMatchArr.forEach(item => {
218
+ const equalSignIndex = item.indexOf('=');
219
+ if (equalSignIndex > 0) {
220
+ // 'type="module"' => { type: "module" }
221
+ const key = item.slice(0, equalSignIndex);
222
+ attributes[key] = item.slice(equalSignIndex + 2, item.length - 1);
223
+ }
224
+ else {
225
+ // 'async ' => 'async'
226
+ // 'defer>' => 'defer'
227
+ const key = item.slice(0, item.length - 1);
228
+ attributes[key] = key;
229
+ }
230
+ });
231
+ return attributes;
232
+ }
233
+ return undefined;
234
+ }
235
+ parseManifestFromHTML(html) {
236
+ const result = {};
237
+ const matchResult = html.match(STYLE_LINK_OR_SCRIPT_REG);
238
+ matchResult.forEach(item => {
239
+ const isLinkTag = item.trim().toLowerCase().slice(1, item.indexOf(' ')) === 'link';
240
+ const linkOrSrcResult = item.match(LINK_OR_SRC_REG);
241
+ if (linkOrSrcResult && linkOrSrcResult[2]) {
242
+ const src = linkOrSrcResult[2];
243
+ const hashName = getResourceFileName(src);
244
+ let barSplitIndex = hashName.indexOf('-');
245
+ let dotSplitIndex = hashName.indexOf('.');
246
+ const splitIndex = barSplitIndex > -1 ? barSplitIndex : dotSplitIndex;
247
+ if (splitIndex > -1) {
248
+ const name = hashName.slice(0, splitIndex);
249
+ const ext = getExtName(hashName);
250
+ const assetsTag = {
251
+ src: src,
252
+ tagName: isLinkTag ? 'link' : 'script'
253
+ };
254
+ const assetName = ext ? `${name}.${ext}` : name;
255
+ if (!result[assetName]) {
256
+ result[assetName] = [assetsTag];
257
+ }
258
+ else {
259
+ result[assetName] = result[assetName].concat(assetsTag);
260
+ }
261
+ const attributes = this.parseTagAttributes(item);
262
+ if (attributes) {
263
+ assetsTag.attributes = attributes;
264
+ }
265
+ // const typeTagResult = item.match(TAG_TYPE_REG);
266
+ // if (typeTagResult && typeTagResult[1]) {
267
+ // assetsTag.attributes = {
268
+ // type: typeTagResult[1]
269
+ // };
270
+ // }
271
+ }
272
+ }
273
+ });
274
+ return result;
275
+ }
276
+ loadAppAssets(app) {
277
+ const basePath = getAssetsBasePath(app);
278
+ const manifest = app.entry ? (isObject(app.entry) ? app.entry.manifest : app.entry) : app.manifest;
279
+ if (manifest) {
280
+ const manifestExt = getExtName(manifest);
281
+ const isHtml = manifestExt === 'html';
282
+ const responseType = isHtml ? 'text' : 'json';
283
+ return this.loadManifest(`${manifest}?t=${new Date().getTime()}`, responseType).pipe(switchMap(manifestResult => {
284
+ const { scripts, styles } = getScriptsAndStylesAssets(app, basePath, manifestResult);
285
+ return this.loadScriptsAndStyles(scripts, styles, {
286
+ app: app.name,
287
+ sandbox: app.sandbox,
288
+ serial: app.loadSerial
289
+ });
290
+ }));
291
+ }
292
+ else {
293
+ const { scripts, styles } = getScriptsAndStylesAssets(app, basePath);
294
+ return this.loadScriptsAndStyles(scripts, styles, {
295
+ app: app.name,
296
+ sandbox: app.sandbox,
297
+ serial: app.loadSerial
298
+ });
299
+ }
300
+ }
301
+ loadManifest(url, responseType = 'json') {
302
+ return this.http
303
+ .get(url, {
304
+ responseType: responseType
305
+ })
306
+ .pipe(map((response) => {
307
+ if (responseType === 'text') {
308
+ return this.parseManifestFromHTML(response);
309
+ }
310
+ else {
311
+ const result = {};
312
+ Object.keys(response).forEach(key => {
313
+ result[key] = [
314
+ {
315
+ src: response[key]
316
+ }
317
+ ];
318
+ });
319
+ return result;
320
+ }
321
+ }));
322
+ }
323
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AssetsLoader, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
324
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AssetsLoader, providedIn: 'root' }); }
325
+ }
326
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AssetsLoader, decorators: [{
327
+ type: Injectable,
328
+ args: [{
329
+ providedIn: 'root'
330
+ }]
331
+ }], ctorParameters: () => [{ type: i1.HttpClient }] });
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3BsYW5ldC9zcmMvYXNzZXRzLWxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkksT0FBTyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQVksUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7O0FBRzFDLE1BQU0sd0JBQXdCLEdBQUcsc0JBQXNCLENBQUM7QUFDeEQsTUFBTSxlQUFlLEdBQUcsdUNBQXVDLENBQUM7QUFDaEUsTUFBTSxhQUFhLEdBQUcsZ0RBQWdELENBQUM7QUFZdkUsTUFBTSxPQUFPLFlBQVk7SUFHckIsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUY1QixrQkFBYSxHQUFhLEVBQUUsQ0FBQztJQUVFLENBQUM7SUFFeEMsVUFBVSxDQUFDLFdBQTBCO1FBQ2pDLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFDaEUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVB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QUNQLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQVcsRUFBRSxlQUFnQyxNQUFNO1FBQzVELE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDWCxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ04sWUFBWSxFQUFFLFlBQXNCO1NBQ3ZDLENBQUM7YUFDRCxJQUFJLENBQ0QsR0FBRyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDbEIsSUFBSSxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQWtCLENBQUMsQ0FBQztZQUMxRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxNQUFNLEdBQW9DLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRzt3QkFDVjs0QkFDSSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQzt5QkFDckI7cUJBQ0osQ0FBQztnQkFDTixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNWLENBQUM7OEdBdFZRLFlBQVk7a0hBQVosWUFBWSxjQUZULE1BQU07OzJGQUVULFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaGFzaENvZGUsIGlzRW1wdHksIGdldFJlc291cmNlRmlsZU5hbWUsIGdldEV4dE5hbWUsIGlzT2JqZWN0LCBnZXRBc3NldHNCYXNlUGF0aCwgZ2V0U2NyaXB0c0FuZFN0eWxlc0Fzc2V0cyB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBvZiwgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIGZvcmtKb2luLCBjb25jYXQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwLCBjb25jYXRBbGwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUGxhbmV0QXBwbGljYXRpb24sIFBsYW5ldEFwcGxpY2F0aW9uRW50cnkgfSBmcm9tICcuL3BsYW5ldC5jbGFzcyc7XG5pbXBvcnQgeyBjcmVhdGVTYW5kYm94IH0gZnJvbSAnLi9zYW5kYm94JztcbmltcG9ydCB7IEFzc2V0c1RhZ0l0ZW0sIExpbmtUYWdBdHRyaWJ1dGVzLCBTY3JpcHRUYWdBdHRyaWJ1dGVzIH0gZnJvbSAnLi9pbm5lci10eXBlcyc7XG5cbmNvbnN0IFNUWUxFX0xJTktfT1JfU0NSSVBUX1JFRyA9IC88W3NjcmlwdHxsaW5rXS4qPz4vZ2k7XG5jb25zdCBMSU5LX09SX1NSQ19SRUcgPSAvKHNyY3xocmVmKT1bXCInXSguKj9bXFwuanN8XFwuY3NzXSlbXCInXS9pO1xuY29uc3QgVEFHX0FUVFJTX1JFRyA9IC8odHlwZXxkZWZlcnxhc3luY3xyZWwpKCg9W1wiJ10uKj9bXCInXSl8XFxzfFxcPikvZ2k7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzTG9hZFJlc3VsdCB7XG4gICAgc3JjOiBzdHJpbmc7XG4gICAgaGFzaENvZGU6IG51bWJlcjtcbiAgICBsb2FkZWQ6IGJvb2xlYW47XG4gICAgc3RhdHVzOiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXNzZXRzTG9hZGVyIHtcbiAgICBwcml2YXRlIGxvYWRlZFNvdXJjZXM6IG51bWJlcltdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgICBsb2FkU2NyaXB0KHNjcmlwdEFzc2V0OiBBc3NldHNUYWdJdGVtKSB7XG4gICAgICAgIGNvbnN0IHsgc3JjLCB0YWdOYW1lLCBhdHRyaWJ1dGVzOiB0YWdBdHRyaWJ1dGVzIH0gPSBzY3JpcHRBc3NldDtcbiAgICAgICAgY29uc3QgaWQgPSBoYXNoQ29kZShzcmMpO1xuICAgICAgICBpZiAodGhpcy5sb2FkZWRTb3VyY2VzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgICAgICBzcmM6IHNyYyxcbiAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0xvYWRlZCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhZ05hbWUgPT09ICdsaW5rJykge1xuICAgICAgICAgICAgY29uc3QgTGlua0F0dHJpYnV0ZXMgPSB0YWdBdHRyaWJ1dGVzIGFzIExpbmtUYWdBdHRyaWJ1dGVzO1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHNyYztcbiAgICAgICAgICAgIGlmIChMaW5rQXR0cmlidXRlcy5yZWwpIHtcbiAgICAgICAgICAgICAgICBsaW5rLnJlbCA9IExpbmtBdHRyaWJ1dGVzLnJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkLFxuICAgICAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnUHJlbG9hZCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPEFzc2V0c0xvYWRSZXN1bHQ+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHRBdHRyaWJ1dGVzID0gdGFnQXR0cmlidXRlcyBhcyBTY3JpcHRUYWdBdHRyaWJ1dGVzO1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSBzY3JpcHRBdHRyaWJ1dGVzPy50eXBlIHx8ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHNyYztcbiAgICAgICAgICAgIGlmICghc2NyaXB0QXR0cmlidXRlcz8uZGVmZXIgfHwgc2NyaXB0QXR0cmlidXRlcz8uZGVmZXIgIT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICBzY3JpcHQuZGVmZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzY3JpcHRBdHRyaWJ1dGVzPy5hc3luYyAmJiBzY3JpcHRBdHRyaWJ1dGVzPy5hc3luYyAhPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY3JpcHRbJ3JlYWR5U3RhdGUnXSkge1xuICAgICAgICAgICAgICAgIC8vIElFXG4gICAgICAgICAgICAgICAgc2NyaXB0WydvbnJlYWR5c3RhdGVjaGFuZ2UnXSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdFsncmVhZHlTdGF0ZSddID09PSAnbG9hZGVkJyB8fCBzY3JpcHRbJ3JlYWR5U3RhdGUnXSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0WydvbnJlYWR5c3RhdGVjaGFuZ2UnXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHNyYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ0xvYWRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkU291cmNlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyc1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdMb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZFNvdXJjZXMucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZFNjcmlwdFdpdGhTYW5kYm94KGFwcDogc3RyaW5nLCBzcmM6IHN0cmluZyk6IE9ic2VydmFibGU8QXNzZXRzTG9hZFJlc3VsdD4ge1xuICAgICAgICBjb25zdCBpZCA9IGhhc2hDb2RlKHNyYyk7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZFNvdXJjZXMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgIGhhc2hDb2RlOiBpZCxcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnTG9hZGVkJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8QXNzZXRzTG9hZFJlc3VsdD4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQoc3JjLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAoY29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkU291cmNlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FuZGJveCA9IGNyZWF0ZVNhbmRib3goYXBwKTtcbiAgICAgICAgICAgICAgICAgICAgc2FuZGJveC5leGVjU2NyaXB0KGNvZGUsIHNyYyk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdMb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHNyYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZFN0eWxlKHNyYzogc3RyaW5nKTogT2JzZXJ2YWJsZTxBc3NldHNMb2FkUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGlkID0gaGFzaENvZGUoc3JjKTtcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkU291cmNlcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkLFxuICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdMb2FkZWQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxBc3NldHNMb2FkUmVzdWx0PikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgICAgICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICAgICAgbGluay5ocmVmID0gc3JjO1xuICAgICAgICAgICAgbGluay5tZWRpYSA9ICdhbGwnO1xuICAgICAgICAgICAgbGluay5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnTG9hZGVkJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRTb3VyY2VzLnB1c2goaWQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxpbmsub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnTG9hZGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkU2NyaXB0cyhcbiAgICAgICAgc291cmNlczogQXNzZXRzVGFnSXRlbVtdLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBhcHA/OiBzdHJpbmc7XG4gICAgICAgICAgICBzYW5kYm94PzogYm9vbGVhbjtcbiAgICAgICAgICAgIHNlcmlhbD86IGJvb2xlYW47XG4gICAgICAgIH0gPSB7XG4gICAgICAgICAgICBzZXJpYWw6IGZhbHNlLFxuICAgICAgICAgICAgc2FuZGJveDogZmFsc2VcbiAgICAgICAgfVxuICAgICk6IE9ic2VydmFibGU8QXNzZXRzTG9hZFJlc3VsdFtdPiB7XG4gICAgICAgIGlmIChpc0VtcHR5KHNvdXJjZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZXMgPSBzb3VyY2VzLm1hcChzb3VyY2UgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETzog5pqC5pe25Y+q5pSv5oyBUHJveHnmspnnrrFcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNhbmRib3ggJiYgd2luZG93LlByb3h5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZFNjcmlwdFdpdGhTYW5kYm94KG9wdGlvbnMuYXBwLCBzb3VyY2Uuc3JjKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZFNjcmlwdChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gY29uY2F0KC4uLm9ic2VydmFibGVzKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtpdGVtXSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY29uY2F0QWxsKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihvYnNlcnZhYmxlcykucGlwZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZFN0eWxlcyhzb3VyY2VzOiBBc3NldHNUYWdJdGVtW10pOiBPYnNlcnZhYmxlPEFzc2V0c0xvYWRSZXN1bHRbXT4ge1xuICAgICAgICBpZiAoaXNFbXB0eShzb3VyY2VzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JrSm9pbihcbiAgICAgICAgICAgIHNvdXJjZXMubWFwKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZFN0eWxlKHNvdXJjZS5zcmMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsb2FkU2NyaXB0c0FuZFN0eWxlcyhcbiAgICAgICAgc2NyaXB0czogQXNzZXRzVGFnSXRlbVtdID0gW10sXG4gICAgICAgIHN0eWxlczogQXNzZXRzVGFnSXRlbVtdID0gW10sXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBhcHA/OiBzdHJpbmc7XG4gICAgICAgICAgICBzYW5kYm94PzogYm9vbGVhbjtcbiAgICAgICAgICAgIHNlcmlhbD86IGJvb2xlYW47XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFt0aGlzLmxvYWRTY3JpcHRzKHNjcmlwdHMsIG9wdGlvbnMpLCB0aGlzLmxvYWRTdHlsZXMoc3R5bGVzKV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cImh0dHA6Ly8xMjcuMC4wLjE6MzAwMS9tYWluLmpzXCIgYXN5bmMgZGVmZXI+PC9zY3JpcHQ+XG4gICAgICogPT4gW2B0eXBlPVwibW9kdWxlXCJgLCBcImFzeW5jIFwiLCBcImRlZmVyPlwiXSBhcyBhdHRyaWJ1dGVTdHJNYXRjaEFyclxuICAgICAqID0+IHsgdHlwZTogXCJtb2R1bGVcIiwgYXN5bmM6IFwiYXN5bmNcIiwgZGVmZXI6IFwiZGVmZXJcIiB9IGFzIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwYXJzZVRhZ0F0dHJpYnV0ZXModGFnOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlU3RyTWF0Y2hBcnIgPSB0YWcubWF0Y2goVEFHX0FUVFJTX1JFRyk7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVTdHJNYXRjaEFycikge1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICAgICAgYXR0cmlidXRlU3RyTWF0Y2hBcnIuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcXVhbFNpZ25JbmRleCA9IGl0ZW0uaW5kZXhPZignPScpO1xuICAgICAgICAgICAgICAgIGlmIChlcXVhbFNpZ25JbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gJ3R5cGU9XCJtb2R1bGVcIicgPT4geyB0eXBlOiBcIm1vZHVsZVwiIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5zbGljZSgwLCBlcXVhbFNpZ25JbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IGl0ZW0uc2xpY2UoZXF1YWxTaWduSW5kZXggKyAyLCBpdGVtLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICdhc3luYyAnID0+ICdhc3luYydcbiAgICAgICAgICAgICAgICAgICAgLy8gJ2RlZmVyPicgPT4gJ2RlZmVyJ1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBpdGVtLnNsaWNlKDAsIGl0ZW0ubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IGtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcGFyc2VNYW5pZmVzdEZyb21IVE1MKGh0bWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIEFzc2V0c1RhZ0l0ZW1bXT4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEFzc2V0c1RhZ0l0ZW1bXT4gPSB7fTtcbiAgICAgICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBodG1sLm1hdGNoKFNUWUxFX0xJTktfT1JfU0NSSVBUX1JFRyk7XG4gICAgICAgIG1hdGNoUmVzdWx0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0xpbmtUYWcgPSBpdGVtLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNsaWNlKDEsIGl0ZW0uaW5kZXhPZignICcpKSA9PT0gJ2xpbmsnO1xuICAgICAgICAgICAgY29uc3QgbGlua09yU3JjUmVzdWx0ID0gaXRlbS5tYXRjaChMSU5LX09SX1NSQ19SRUcpO1xuICAgICAgICAgICAgaWYgKGxpbmtPclNyY1Jlc3VsdCAmJiBsaW5rT3JTcmNSZXN1bHRbMl0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBsaW5rT3JTcmNSZXN1bHRbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzaE5hbWUgPSBnZXRSZXNvdXJjZUZpbGVOYW1lKHNyYyk7XG4gICAgICAgICAgICAgICAgbGV0IGJhclNwbGl0SW5kZXggPSBoYXNoTmFtZS5pbmRleE9mKCctJyk7XG4gICAgICAgICAgICAgICAgbGV0IGRvdFNwbGl0SW5kZXggPSBoYXNoTmFtZS5pbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRJbmRleCA9IGJhclNwbGl0SW5kZXggPiAtMSA/IGJhclNwbGl0SW5kZXggOiBkb3RTcGxpdEluZGV4O1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGhhc2hOYW1lLnNsaWNlKDAsIHNwbGl0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHQgPSBnZXRFeHROYW1lKGhhc2hOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXNzZXRzVGFnOiBBc3NldHNUYWdJdGVtID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBpc0xpbmtUYWcgPyAnbGluaycgOiAnc2NyaXB0J1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc3NldE5hbWUgPSBleHQgPyBgJHtuYW1lfS4ke2V4dH1gIDogbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRbYXNzZXROYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2Fzc2V0TmFtZV0gPSBbYXNzZXRzVGFnXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFthc3NldE5hbWVdID0gcmVzdWx0W2Fzc2V0TmFtZV0uY29uY2F0KGFzc2V0c1RhZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5wYXJzZVRhZ0F0dHJpYnV0ZXMoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NldHNUYWcuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgdHlwZVRhZ1Jlc3VsdCA9IGl0ZW0ubWF0Y2goVEFHX1RZUEVfUkVHKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVUYWdSZXN1bHQgJiYgdHlwZVRhZ1Jlc3VsdFsxXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYXNzZXRzVGFnLmF0dHJpYnV0ZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdHlwZTogdHlwZVRhZ1Jlc3VsdFsxXVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgbG9hZEFwcEFzc2V0cyhhcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gZ2V0QXNzZXRzQmFzZVBhdGgoYXBwKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBhcHAuZW50cnkgPyAoaXNPYmplY3Q8UGxhbmV0QXBwbGljYXRpb25FbnRyeT4oYXBwLmVudHJ5KSA/IGFwcC5lbnRyeS5tYW5pZmVzdCA6IGFwcC5lbnRyeSkgOiBhcHAubWFuaWZlc3Q7XG4gICAgICAgIGlmIChtYW5pZmVzdCkge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RFeHQgPSBnZXRFeHROYW1lKG1hbmlmZXN0KTtcbiAgICAgICAgICAgIGNvbnN0IGlzSHRtbCA9IG1hbmlmZXN0RXh0ID09PSAnaHRtbCc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSBpc0h0bWwgPyAndGV4dCcgOiAnanNvbic7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTWFuaWZlc3QoYCR7bWFuaWZlc3R9P3Q9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLCByZXNwb25zZVR5cGUpLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKG1hbmlmZXN0UmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBzY3JpcHRzLCBzdHlsZXMgfSA9IGdldFNjcmlwdHNBbmRTdHlsZXNBc3NldHMoYXBwLCBiYXNlUGF0aCwgbWFuaWZlc3RSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkU2NyaXB0c0FuZFN0eWxlcyhzY3JpcHRzLCBzdHlsZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYW5kYm94OiBhcHAuc2FuZGJveCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbDogYXBwLmxvYWRTZXJpYWxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IHNjcmlwdHMsIHN0eWxlcyB9ID0gZ2V0U2NyaXB0c0FuZFN0eWxlc0Fzc2V0cyhhcHAsIGJhc2VQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRTY3JpcHRzQW5kU3R5bGVzKHNjcmlwdHMsIHN0eWxlcywge1xuICAgICAgICAgICAgICAgIGFwcDogYXBwLm5hbWUsXG4gICAgICAgICAgICAgICAgc2FuZGJveDogYXBwLnNhbmRib3gsXG4gICAgICAgICAgICAgICAgc2VyaWFsOiBhcHAubG9hZFNlcmlhbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkTWFuaWZlc3QodXJsOiBzdHJpbmcsIHJlc3BvbnNlVHlwZTogJ3RleHQnIHwgJ2pzb24nID0gJ2pzb24nKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBBc3NldHNUYWdJdGVtW10+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5nZXQodXJsLCB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiByZXNwb25zZVR5cGUgYXMgJ2pzb24nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VNYW5pZmVzdEZyb21IVE1MKHJlc3BvbnNlIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEFzc2V0c1RhZ0l0ZW1bXT4gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogcmVzcG9uc2Vba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==