@openziti/ziti-console-lib 0.12.5 → 0.12.7

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 (39) hide show
  1. package/assets/fonts/icomoon.eot +0 -0
  2. package/assets/fonts/icomoon.svg +8 -0
  3. package/assets/fonts/icomoon.ttf +0 -0
  4. package/assets/fonts/icomoon.woff +0 -0
  5. package/assets/fonts/icomoon.woff2 +0 -0
  6. package/assets/html/terminators.htm +1 -1
  7. package/esm2022/lib/features/config-editor/config-editor.component.mjs +6 -2
  8. package/esm2022/lib/features/dynamic-widgets/text-list/text-list-input.component.mjs +4 -1
  9. package/esm2022/lib/features/preview-list/preview-list.component.mjs +10 -3
  10. package/esm2022/lib/features/progress-meter/progress-meter.component.mjs +44 -0
  11. package/esm2022/lib/features/progress-wizard/progress-wizard.component.mjs +91 -0
  12. package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.component.mjs +19 -19
  13. package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.helper.mjs +10 -4
  14. package/esm2022/lib/pages/identities/identities-page.service.mjs +7 -2
  15. package/esm2022/lib/services/schema.service.mjs +3 -3
  16. package/esm2022/lib/version.mjs +2 -2
  17. package/esm2022/lib/ziti-console-lib.module.mjs +19 -5
  18. package/esm2022/public-api.mjs +5 -1
  19. package/fesm2022/openziti-ziti-console-lib.mjs +195 -32
  20. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  21. package/lib/features/config-editor/config-editor.component.d.ts.map +1 -1
  22. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts.map +1 -1
  23. package/lib/features/preview-list/preview-list.component.d.ts +1 -0
  24. package/lib/features/preview-list/preview-list.component.d.ts.map +1 -1
  25. package/lib/features/progress-meter/progress-meter.component.d.ts +19 -0
  26. package/lib/features/progress-meter/progress-meter.component.d.ts.map +1 -0
  27. package/lib/features/progress-wizard/progress-wizard.component.d.ts +31 -0
  28. package/lib/features/progress-wizard/progress-wizard.component.d.ts.map +1 -0
  29. package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts +1 -0
  30. package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts.map +1 -1
  31. package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts.map +1 -1
  32. package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts +1 -1
  33. package/lib/pages/identities/identities-page.service.d.ts +1 -0
  34. package/lib/pages/identities/identities-page.service.d.ts.map +1 -1
  35. package/lib/ziti-console-lib.module.d.ts +20 -18
  36. package/lib/ziti-console-lib.module.d.ts.map +1 -1
  37. package/package.json +1 -1
  38. package/public-api.d.ts +4 -0
  39. package/public-api.d.ts.map +1 -1
@@ -0,0 +1,91 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "@angular/forms";
5
+ export class ProgressWizardStep {
6
+ constructor() {
7
+ this.index = 0;
8
+ this.label = '';
9
+ }
10
+ }
11
+ ;
12
+ class ProgressWizardComponent {
13
+ constructor() {
14
+ this.errors = {};
15
+ this.title = '';
16
+ this.steps = [];
17
+ this.backButtonLabel = 'Back';
18
+ this.nextButtonLabel = 'Next';
19
+ this.nextButtonDisabled = false;
20
+ this.titleImageSrc = '';
21
+ this.showCloseButton = true;
22
+ this.currentStepIndex = 0;
23
+ this.currentStepIndexChange = new EventEmitter;
24
+ this.close = new EventEmitter;
25
+ this.done = new EventEmitter;
26
+ this.stepChanged = new EventEmitter;
27
+ }
28
+ cancel() {
29
+ this.close.emit();
30
+ }
31
+ confirm() {
32
+ this.close.emit();
33
+ }
34
+ nextStep() {
35
+ if (this.currentStepIndex >= (this.steps.length - 1)) {
36
+ this.done.emit();
37
+ return;
38
+ }
39
+ this.currentStepIndex++;
40
+ this.currentStepIndexChange.emit(this.currentStepIndex);
41
+ this.stepChanged.emit(this.steps[this.currentStepIndex]);
42
+ }
43
+ goToStep(stepNum) {
44
+ this.currentStepIndex = stepNum.index;
45
+ this.currentStepIndexChange.emit(this.currentStepIndex);
46
+ this.stepChanged.emit(this.steps[this.currentStepIndex]);
47
+ }
48
+ prevStep() {
49
+ this.currentStepIndex--;
50
+ this.currentStepIndexChange.emit(this.currentStepIndex);
51
+ this.stepChanged.emit(this.steps[this.currentStepIndex]);
52
+ }
53
+ get progressTrackHeight() {
54
+ const heightfactor = 8.333;
55
+ const trackNumber = ((this.steps ? this.steps.length : 1) - 1);
56
+ const trackHeight = heightfactor * trackNumber;
57
+ return trackHeight + 'rem';
58
+ }
59
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProgressWizardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
60
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProgressWizardComponent, selector: "lib-progress-wizard", inputs: { title: "title", steps: "steps", backButtonLabel: "backButtonLabel", nextButtonLabel: "nextButtonLabel", nextButtonDisabled: "nextButtonDisabled", titleImageSrc: "titleImageSrc", showCloseButton: "showCloseButton", currentStepIndex: "currentStepIndex" }, outputs: { currentStepIndexChange: "currentStepIndexChange", close: "close", done: "done", stepChanged: "stepChanged" }, ngImport: i0, template: "<div class=\"progress-wizard-wrapper\">\n <div class=\"progress-wizard-container\">\n <div *ngIf=\"showCloseButton\" (click)=\"cancel()\" class=\"close cancel\"></div>\n <div class=\"side-progress-bar\">\n <div class=\"progress-steps\">\n <div class=\"progress-track\" style=\"height: {{progressTrackHeight}}\"></div>\n <div *ngFor=\"let step of steps\" class=\"progress-step\" [ngClass]=\"{'step-active': step.index === currentStepIndex}\" (click)=\"goToStep(step)\">\n <div class=\"progress-step-number\">{{step.index}}</div>\n <div class=\"progress-step-number-background\"></div>\n <div class=\"progress-step-label\">{{step.label}}</div>\n </div>\n </div>\n </div>\n <div>\n <div class=\"center-content-container\">\n <div class=\"center-content\">\n <div class=\"header-title-container\" style=\"display: flex; flex-direction: row; gap: var(--gapSmall);align-items: center;\">\n <div class=\"header-title-image\" style=\"background-image: url({{titleImageSrc}});\"></div>\n <div class=\"header-title-container\">\n <div class=\"header-title\">{{title}}</div>\n </div>\n </div>\n <form name=\"form\" class=\"step-content-form\">\n <div class=\"step-content-wrapper\">\n <ng-content></ng-content>\n </div>\n <div class=\"buttons-container\">\n <div *ngIf=\"currentStepIndex === 0\">\n </div>\n <button *ngIf=\"currentStepIndex > 0\" name=\"action\" type=\"submit\" class=\"btn-primary\" (click)=\"prevStep()\">\n {{backButtonLabel}}\n </button>\n <button name=\"action\" type=\"submit\" class=\"btn-primary\" (click)=\"nextStep()\" [disabled]=\"nextButtonDisabled\">\n {{nextButtonLabel}}\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".progress-wizard-wrapper{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;box-shadow:-1px 1rem 1.5625rem #0003}.progress-wizard-wrapper .progress-wizard-container{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;display:flex;flex-direction:row;position:relative}.progress-wizard-wrapper .progress-wizard-container .center-content-container{-webkit-backdrop-filter:saturate(180%) blur(1.25rem);backdrop-filter:saturate(180%) blur(1.25rem);background-color:#eceef2;padding:2.1875rem;border-radius:.5rem;box-shadow:0 0 1.5625rem #0003;display:flex;flex-direction:column;height:100%;max-width:52rem}.progress-wizard-wrapper .progress-wizard-container .center-content-container .center-content{display:flex;flex-direction:column;height:100%}.header-title{color:var(--primaryColor)!important;filter:brightness(var(--brightnessDark));opacity:1;font-family:Russo One,Arial,sans-serif;font-size:2.35rem!important;line-height:unset;font-weight:400!important;margin:0!important;text-align:center;height:100%}.header-title-container{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;overflow:visible}.step-content-container{display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;margin-top:var(--marginXL);padding:0!important;width:100%}.step-content-container .step-label-text{text-transform:none;font-size:1.125rem;width:100%;margin-bottom:var(--marginSmall);font-weight:600}.step-content-container .step-label-text.list-instructions{font-size:1rem;font-weight:600}.header-title-image{background-image:url(/assets/svgs/zlan-logo.svg);background-size:4.25rem;height:4.25rem;width:4.25rem}.buttons-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center;margin-top:var(--marginXXL)}.buttons-container button{box-shadow:0 .1875rem .5625rem 0 var(--primaryColorOpaque)!important;color:#fff!important;line-height:2.5rem!important;height:3.125rem!important;border:none!important;vertical-align:middle!important;text-align:center!important;position:relative!important;z-index:1!important;display:inline-block!important;padding:0rem;margin-top:1.5625rem!important;transition:color .2s!important;font-size:.875rem!important;font-weight:600!important;font-family:Open Sans!important;text-transform:uppercase!important;border-radius:.5rem!important;min-width:10rem;background:var(--primaryColor)!important;cursor:pointer}.buttons-container button:hover{outline:0!important;box-shadow:0 .3125rem 1.25rem #0000000d!important}.buttons-container button:active{filter:brightness(95%)!important;box-shadow:none!important;transform:translateY(1px)!important}.buttons-container button.btn-primary{position:relative;width:10rem;margin-top:0!important}.buttons-container button.btn-primary:disabled{filter:grayscale(1);opacity:.5;pointer-events:none}.buttons-container .saving-button,.buttons-container .saving-button:hover{filter:grayscale(1)!important;opacity:.5!important}.side-progress-bar{display:flex;flex-direction:row;width:20rem;margin-right:-1rem;position:relative;border-top-left-radius:.5rem;border-bottom-left-radius:.5rem;background-color:#eceef2f4;align-items:flex-start}.side-progress-bar .progress-steps{display:flex;flex-direction:column;height:100%;width:100%;justify-content:flex-start;align-items:flex-start;gap:5.5rem;cursor:pointer;padding:var(--paddingXXL) 0}.side-progress-bar .progress-steps .progress-track{position:absolute;width:.175rem;background-color:var(--stroke);left:2.175rem;height:23rem;opacity:.4}.side-progress-bar .progress-steps .progress-step{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;width:100%;height:2.5rem;filter:grayscale(1)}.side-progress-bar .progress-steps .progress-step.step-active{filter:none}.side-progress-bar .progress-steps .progress-step.step-active .progress-step-number{opacity:1;box-shadow:1px 0 .8rem #0003}.side-progress-bar .progress-steps .progress-step.step-active .progress-step-label{opacity:1}.side-progress-bar .progress-steps .progress-step-number{width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;font-size:1.125rem;font-weight:600;background-color:var(--primary);border-style:solid;border-radius:2rem;border-color:#fff;color:var(--white);margin-left:1rem;border-width:.25rem;z-index:999999;opacity:.4}.side-progress-bar .progress-steps .progress-step-label{font-size:1.125rem;font-weight:600;margin-left:var(--marginSmall);opacity:.4}.side-progress-bar .progress-steps .progress-step-number-background{position:absolute;width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;font-size:1.125rem;font-weight:600;background-color:#eceef2;border-style:solid;border-radius:2rem;border-color:#fff;color:var(--white);margin-left:1rem;border-width:.25rem;z-index:999}.step-content-form{display:flex;flex-direction:column;background-color:transparent;font-family:Open Sans;height:100%}.step-content-form .step-content-wrapper{height:100%;display:flex;flex-direction:column;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
61
+ }
62
+ export { ProgressWizardComponent };
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProgressWizardComponent, decorators: [{
64
+ type: Component,
65
+ args: [{ selector: 'lib-progress-wizard', template: "<div class=\"progress-wizard-wrapper\">\n <div class=\"progress-wizard-container\">\n <div *ngIf=\"showCloseButton\" (click)=\"cancel()\" class=\"close cancel\"></div>\n <div class=\"side-progress-bar\">\n <div class=\"progress-steps\">\n <div class=\"progress-track\" style=\"height: {{progressTrackHeight}}\"></div>\n <div *ngFor=\"let step of steps\" class=\"progress-step\" [ngClass]=\"{'step-active': step.index === currentStepIndex}\" (click)=\"goToStep(step)\">\n <div class=\"progress-step-number\">{{step.index}}</div>\n <div class=\"progress-step-number-background\"></div>\n <div class=\"progress-step-label\">{{step.label}}</div>\n </div>\n </div>\n </div>\n <div>\n <div class=\"center-content-container\">\n <div class=\"center-content\">\n <div class=\"header-title-container\" style=\"display: flex; flex-direction: row; gap: var(--gapSmall);align-items: center;\">\n <div class=\"header-title-image\" style=\"background-image: url({{titleImageSrc}});\"></div>\n <div class=\"header-title-container\">\n <div class=\"header-title\">{{title}}</div>\n </div>\n </div>\n <form name=\"form\" class=\"step-content-form\">\n <div class=\"step-content-wrapper\">\n <ng-content></ng-content>\n </div>\n <div class=\"buttons-container\">\n <div *ngIf=\"currentStepIndex === 0\">\n </div>\n <button *ngIf=\"currentStepIndex > 0\" name=\"action\" type=\"submit\" class=\"btn-primary\" (click)=\"prevStep()\">\n {{backButtonLabel}}\n </button>\n <button name=\"action\" type=\"submit\" class=\"btn-primary\" (click)=\"nextStep()\" [disabled]=\"nextButtonDisabled\">\n {{nextButtonLabel}}\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".progress-wizard-wrapper{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;box-shadow:-1px 1rem 1.5625rem #0003}.progress-wizard-wrapper .progress-wizard-container{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;display:flex;flex-direction:row;position:relative}.progress-wizard-wrapper .progress-wizard-container .center-content-container{-webkit-backdrop-filter:saturate(180%) blur(1.25rem);backdrop-filter:saturate(180%) blur(1.25rem);background-color:#eceef2;padding:2.1875rem;border-radius:.5rem;box-shadow:0 0 1.5625rem #0003;display:flex;flex-direction:column;height:100%;max-width:52rem}.progress-wizard-wrapper .progress-wizard-container .center-content-container .center-content{display:flex;flex-direction:column;height:100%}.header-title{color:var(--primaryColor)!important;filter:brightness(var(--brightnessDark));opacity:1;font-family:Russo One,Arial,sans-serif;font-size:2.35rem!important;line-height:unset;font-weight:400!important;margin:0!important;text-align:center;height:100%}.header-title-container{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;overflow:visible}.step-content-container{display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;margin-top:var(--marginXL);padding:0!important;width:100%}.step-content-container .step-label-text{text-transform:none;font-size:1.125rem;width:100%;margin-bottom:var(--marginSmall);font-weight:600}.step-content-container .step-label-text.list-instructions{font-size:1rem;font-weight:600}.header-title-image{background-image:url(/assets/svgs/zlan-logo.svg);background-size:4.25rem;height:4.25rem;width:4.25rem}.buttons-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center;margin-top:var(--marginXXL)}.buttons-container button{box-shadow:0 .1875rem .5625rem 0 var(--primaryColorOpaque)!important;color:#fff!important;line-height:2.5rem!important;height:3.125rem!important;border:none!important;vertical-align:middle!important;text-align:center!important;position:relative!important;z-index:1!important;display:inline-block!important;padding:0rem;margin-top:1.5625rem!important;transition:color .2s!important;font-size:.875rem!important;font-weight:600!important;font-family:Open Sans!important;text-transform:uppercase!important;border-radius:.5rem!important;min-width:10rem;background:var(--primaryColor)!important;cursor:pointer}.buttons-container button:hover{outline:0!important;box-shadow:0 .3125rem 1.25rem #0000000d!important}.buttons-container button:active{filter:brightness(95%)!important;box-shadow:none!important;transform:translateY(1px)!important}.buttons-container button.btn-primary{position:relative;width:10rem;margin-top:0!important}.buttons-container button.btn-primary:disabled{filter:grayscale(1);opacity:.5;pointer-events:none}.buttons-container .saving-button,.buttons-container .saving-button:hover{filter:grayscale(1)!important;opacity:.5!important}.side-progress-bar{display:flex;flex-direction:row;width:20rem;margin-right:-1rem;position:relative;border-top-left-radius:.5rem;border-bottom-left-radius:.5rem;background-color:#eceef2f4;align-items:flex-start}.side-progress-bar .progress-steps{display:flex;flex-direction:column;height:100%;width:100%;justify-content:flex-start;align-items:flex-start;gap:5.5rem;cursor:pointer;padding:var(--paddingXXL) 0}.side-progress-bar .progress-steps .progress-track{position:absolute;width:.175rem;background-color:var(--stroke);left:2.175rem;height:23rem;opacity:.4}.side-progress-bar .progress-steps .progress-step{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;width:100%;height:2.5rem;filter:grayscale(1)}.side-progress-bar .progress-steps .progress-step.step-active{filter:none}.side-progress-bar .progress-steps .progress-step.step-active .progress-step-number{opacity:1;box-shadow:1px 0 .8rem #0003}.side-progress-bar .progress-steps .progress-step.step-active .progress-step-label{opacity:1}.side-progress-bar .progress-steps .progress-step-number{width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;font-size:1.125rem;font-weight:600;background-color:var(--primary);border-style:solid;border-radius:2rem;border-color:#fff;color:var(--white);margin-left:1rem;border-width:.25rem;z-index:999999;opacity:.4}.side-progress-bar .progress-steps .progress-step-label{font-size:1.125rem;font-weight:600;margin-left:var(--marginSmall);opacity:.4}.side-progress-bar .progress-steps .progress-step-number-background{position:absolute;width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;font-size:1.125rem;font-weight:600;background-color:#eceef2;border-style:solid;border-radius:2rem;border-color:#fff;color:var(--white);margin-left:1rem;border-width:.25rem;z-index:999}.step-content-form{display:flex;flex-direction:column;background-color:transparent;font-family:Open Sans;height:100%}.step-content-form .step-content-wrapper{height:100%;display:flex;flex-direction:column;justify-content:center}\n"] }]
66
+ }], ctorParameters: function () { return []; }, propDecorators: { title: [{
67
+ type: Input
68
+ }], steps: [{
69
+ type: Input
70
+ }], backButtonLabel: [{
71
+ type: Input
72
+ }], nextButtonLabel: [{
73
+ type: Input
74
+ }], nextButtonDisabled: [{
75
+ type: Input
76
+ }], titleImageSrc: [{
77
+ type: Input
78
+ }], showCloseButton: [{
79
+ type: Input
80
+ }], currentStepIndex: [{
81
+ type: Input
82
+ }], currentStepIndexChange: [{
83
+ type: Output
84
+ }], close: [{
85
+ type: Output
86
+ }], done: [{
87
+ type: Output
88
+ }], stepChanged: [{
89
+ type: Output
90
+ }] } });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3Mtd2l6YXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy9wcm9ncmVzcy13aXphcmQvcHJvZ3Jlc3Mtd2l6YXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy9wcm9ncmVzcy13aXphcmQvcHJvZ3Jlc3Mtd2l6YXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQVksTUFBTSxlQUFlLENBQUM7Ozs7QUFJeEYsTUFBTSxPQUFPLGtCQUFrQjtJQUEvQjtRQUNFLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixVQUFLLEdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Q0FBQTtBQUFBLENBQUM7QUFFRixNQUthLHVCQUF1QjtJQWlCbEM7UUFmQSxXQUFNLEdBQVEsRUFBRSxDQUFDO1FBRVIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLFVBQUssR0FBeUIsRUFBRSxDQUFDO1FBQ2pDLG9CQUFlLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLG9CQUFlLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDcEIsMkJBQXNCLEdBQUcsSUFBSSxZQUFpQixDQUFDO1FBQy9DLFVBQUssR0FBRyxJQUFJLFlBQWlCLENBQUM7UUFDOUIsU0FBSSxHQUFHLElBQUksWUFBaUIsQ0FBQztRQUM3QixnQkFBVyxHQUFHLElBQUksWUFBWSxDQUFDO0lBRTFCLENBQUM7SUFFaEIsTUFBTTtRQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxRQUFRLENBQUMsT0FBTztRQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sV0FBVyxHQUFHLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDL0MsT0FBTyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7K0dBdERVLHVCQUF1QjttR0FBdkIsdUJBQXVCLDRiQ2RwQyxnK0RBMENBOztTRDVCYSx1QkFBdUI7NEZBQXZCLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUI7MEVBUXRCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNJLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2RlbGF5LCBkZWZlciwgaXNFbXB0eX0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHtjbG9uZURlZXB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1dpemFyZFN0ZXAge1xuICBpbmRleCA9IDA7XG4gIGxhYmVsOiBzdHJpbmcgPSAnJztcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1wcm9ncmVzcy13aXphcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZ3Jlc3Mtd2l6YXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvZ3Jlc3Mtd2l6YXJkLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NXaXphcmRDb21wb25lbnQge1xuXG4gIGVycm9yczogYW55ID0ge307XG5cbiAgQElucHV0KCkgdGl0bGUgPSAnJztcbiAgQElucHV0KCkgc3RlcHM6IFByb2dyZXNzV2l6YXJkU3RlcFtdID0gW107XG4gIEBJbnB1dCgpIGJhY2tCdXR0b25MYWJlbCA9ICdCYWNrJztcbiAgQElucHV0KCkgbmV4dEJ1dHRvbkxhYmVsID0gJ05leHQnO1xuICBASW5wdXQoKSBuZXh0QnV0dG9uRGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgdGl0bGVJbWFnZVNyYyA9ICcnO1xuICBASW5wdXQoKSBzaG93Q2xvc2VCdXR0b24gPSB0cnVlO1xuICBASW5wdXQoKSBjdXJyZW50U3RlcEluZGV4ID0gMDtcbiAgQE91dHB1dCgpIGN1cnJlbnRTdGVwSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIGRvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBzdGVwQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIGNvbmZpcm0oKSB7XG4gICAgdGhpcy5jbG9zZS5lbWl0KCk7XG4gIH1cblxuICBuZXh0U3RlcCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcEluZGV4ID49ICh0aGlzLnN0ZXBzLmxlbmd0aCAtIDEpKSB7XG4gICAgICB0aGlzLmRvbmUuZW1pdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXgrKztcbiAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLmN1cnJlbnRTdGVwSW5kZXgpO1xuICAgIHRoaXMuc3RlcENoYW5nZWQuZW1pdCh0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0pO1xuICB9XG5cbiAgZ29Ub1N0ZXAoc3RlcE51bSkge1xuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IHN0ZXBOdW0uaW5kZXg7XG4gICAgdGhpcy5jdXJyZW50U3RlcEluZGV4Q2hhbmdlLmVtaXQodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcbiAgICB0aGlzLnN0ZXBDaGFuZ2VkLmVtaXQodGhpcy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwSW5kZXhdKTtcbiAgfVxuXG4gIHByZXZTdGVwKCkge1xuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleENoYW5nZS5lbWl0KHRoaXMuY3VycmVudFN0ZXBJbmRleCk7XG4gICAgdGhpcy5zdGVwQ2hhbmdlZC5lbWl0KHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcEluZGV4XSk7XG4gIH1cblxuICBnZXQgcHJvZ3Jlc3NUcmFja0hlaWdodCgpIHtcbiAgICBjb25zdCBoZWlnaHRmYWN0b3IgPSA4LjMzMztcbiAgICBjb25zdCB0cmFja051bWJlciA9ICgodGhpcy5zdGVwcyA/IHRoaXMuc3RlcHMubGVuZ3RoIDogMSkgLSAxKTtcbiAgICBjb25zdCB0cmFja0hlaWdodCA9IGhlaWdodGZhY3RvciAqIHRyYWNrTnVtYmVyO1xuICAgIHJldHVybiB0cmFja0hlaWdodCArICdyZW0nO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHJvZ3Jlc3Mtd2l6YXJkLXdyYXBwZXJcIj5cbiAgPGRpdiBjbGFzcz1cInByb2dyZXNzLXdpemFyZC1jb250YWluZXJcIj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0Nsb3NlQnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbCgpXCIgY2xhc3M9XCJjbG9zZSBjYW5jZWxcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2lkZS1wcm9ncmVzcy1iYXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1zdGVwc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtdHJhY2tcIiBzdHlsZT1cImhlaWdodDoge3twcm9ncmVzc1RyYWNrSGVpZ2h0fX1cIj48L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwc1wiIGNsYXNzPVwicHJvZ3Jlc3Mtc3RlcFwiIFtuZ0NsYXNzXT1cInsnc3RlcC1hY3RpdmUnOiBzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcEluZGV4fVwiIChjbGljayk9XCJnb1RvU3RlcChzdGVwKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1zdGVwLW51bWJlclwiPnt7c3RlcC5pbmRleH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLXN0ZXAtbnVtYmVyLWJhY2tncm91bmRcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3Mtc3RlcC1sYWJlbFwiPnt7c3RlcC5sYWJlbH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXItY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlci1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci10aXRsZS1jb250YWluZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7IGdhcDogdmFyKC0tZ2FwU21hbGwpO2FsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXRpdGxlLWltYWdlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoe3t0aXRsZUltYWdlU3JjfX0pO1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci10aXRsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci10aXRsZVwiPnt7dGl0bGV9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGZvcm0gbmFtZT1cImZvcm1cIiBjbGFzcz1cInN0ZXAtY29udGVudC1mb3JtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC1jb250ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRTdGVwSW5kZXggPT09IDBcIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJjdXJyZW50U3RlcEluZGV4ID4gMFwiIG5hbWU9XCJhY3Rpb25cIiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4tcHJpbWFyeVwiIChjbGljayk9XCJwcmV2U3RlcCgpXCI+XG4gICAgICAgICAgICAgICAge3tiYWNrQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBuYW1lPVwiYWN0aW9uXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuLXByaW1hcnlcIiAoY2xpY2spPVwibmV4dFN0ZXAoKVwiIFtkaXNhYmxlZF09XCJuZXh0QnV0dG9uRGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICB7e25leHRCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19