@sumaris-net/ngx-components 18.7.0 → 18.7.1-rc1

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 (106) hide show
  1. package/doc/changelog.md +94 -0
  2. package/esm2022/public_api.mjs +4 -1
  3. package/esm2022/src/app/admin/users/users.mjs +2 -2
  4. package/esm2022/src/app/core/account/account.page.mjs +1 -1
  5. package/esm2022/src/app/core/account/password/change-password.page.mjs +2 -2
  6. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +3 -3
  7. package/esm2022/src/app/core/form/list/list.form.mjs +2 -2
  8. package/esm2022/src/app/core/form/properties/properties.form.mjs +15 -6
  9. package/esm2022/src/app/core/form/properties/properties.utils.mjs +9 -10
  10. package/esm2022/src/app/core/home/home.mjs +4 -2
  11. package/esm2022/src/app/core/menu/menu.component.mjs +19 -24
  12. package/esm2022/src/app/core/menu/menu.service.mjs +6 -3
  13. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +1 -1
  14. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +1 -1
  15. package/esm2022/src/app/core/register/register-confirm.page.mjs +1 -1
  16. package/esm2022/src/app/core/register/register.form.mjs +1 -1
  17. package/esm2022/src/app/core/services/model/entity.model.mjs +14 -5
  18. package/esm2022/src/app/core/services/platform.service.mjs +27 -10
  19. package/esm2022/src/app/core/settings/settings.page.mjs +1 -1
  20. package/esm2022/src/app/core/table/column/actions-column.component.mjs +3 -3
  21. package/esm2022/src/app/core/table/column/row-field.component.mjs +1 -1
  22. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  23. package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
  24. package/esm2022/src/app/shared/dates.mjs +13 -1
  25. package/esm2022/src/app/shared/directives/autoresize.directive.mjs +75 -0
  26. package/esm2022/src/app/shared/directives/directives.module.mjs +5 -4
  27. package/esm2022/src/app/shared/form/field.component.mjs +10 -4
  28. package/esm2022/src/app/shared/forms.mjs +3 -1
  29. package/esm2022/src/app/shared/functions.mjs +7 -1
  30. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +3 -2
  31. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +11 -4
  32. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +1 -1
  33. package/esm2022/src/app/shared/markdown/markdown.component.mjs +55 -81
  34. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +17 -10
  35. package/esm2022/src/app/shared/markdown/markdown.service.mjs +7 -5
  36. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +8 -1
  37. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +16 -7
  38. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +71 -36
  39. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +3 -3
  40. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +2 -2
  41. package/esm2022/src/app/shared/material/chips/material.chips.mjs +13 -5
  42. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +19 -9
  43. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +4 -4
  44. package/esm2022/src/app/shared/material/text/text-form.component.mjs +5 -4
  45. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +3 -3
  46. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +1 -1
  47. package/esm2022/src/app/shared/observables.mjs +5 -5
  48. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +18 -2
  49. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +3 -12
  50. package/esm2022/src/app/shared/pipes/html.pipes.mjs +18 -1
  51. package/esm2022/src/app/shared/pipes/observable.pipes.mjs +44 -0
  52. package/esm2022/src/app/shared/pipes/pipes.module.mjs +28 -6
  53. package/esm2022/src/app/shared/pipes/string.pipes.mjs +35 -4
  54. package/esm2022/src/app/shared/print/print.service.mjs +305 -0
  55. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +4 -4
  56. package/esm2022/src/app/shared/toast/toast.testing.mjs +13 -11
  57. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +5 -4
  58. package/esm2022/src/app/shared/toast/toasts.mjs +23 -33
  59. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +3 -3
  60. package/esm2022/src/app/shared/toolbar/toolbar.mjs +7 -3
  61. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +3 -3
  62. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +2 -2
  63. package/esm2022/src/app/shared/validator/validators.mjs +12 -8
  64. package/esm2022/src/app/social/message/message.form.mjs +4 -3
  65. package/fesm2022/sumaris-net.ngx-components.mjs +971 -373
  66. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  67. package/package.json +1 -1
  68. package/public_api.d.ts +3 -0
  69. package/src/app/core/form/properties/properties.form.d.ts +2 -0
  70. package/src/app/core/menu/menu.component.d.ts +3 -6
  71. package/src/app/core/services/model/entity.model.d.ts +5 -3
  72. package/src/app/core/services/platform.service.d.ts +9 -2
  73. package/src/app/shared/dates.d.ts +4 -0
  74. package/src/app/shared/directives/autoresize.directive.d.ts +20 -0
  75. package/src/app/shared/directives/directives.module.d.ts +4 -3
  76. package/src/app/shared/form/field.component.d.ts +3 -1
  77. package/src/app/shared/functions.d.ts +6 -0
  78. package/src/app/shared/image/gallery/image-gallery.component.d.ts +4 -1
  79. package/src/app/shared/markdown/markdown.component.d.ts +12 -7
  80. package/src/app/shared/markdown/markdown.modal.d.ts +9 -2
  81. package/src/app/shared/markdown/markdown.utils.d.ts +1 -0
  82. package/src/app/shared/markdown/testing/markdown.test.d.ts +4 -1
  83. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +2 -0
  84. package/src/app/shared/material/chips/material.chips.d.ts +1 -0
  85. package/src/app/shared/material/datetime/material.datetime.d.ts +1 -0
  86. package/src/app/shared/observables.d.ts +2 -2
  87. package/src/app/shared/pipes/arrays.pipe.d.ts +8 -0
  88. package/src/app/shared/pipes/html.pipes.d.ts +7 -0
  89. package/src/app/shared/pipes/observable.pipes.d.ts +19 -0
  90. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  91. package/src/app/shared/pipes/string.pipes.d.ts +11 -1
  92. package/src/app/shared/print/print.service.d.ts +94 -0
  93. package/src/app/shared/rx-state/rx-state.decorators.d.ts +2 -2
  94. package/src/app/shared/toast/toast.testing.d.ts +1 -1
  95. package/src/app/shared/toast/toast.testing.module.d.ts +2 -1
  96. package/src/app/shared/toast/toasts.d.ts +2 -3
  97. package/src/app/shared/toolbar/toolbar.d.ts +3 -1
  98. package/src/app/shared/validator/validators.d.ts +3 -1
  99. package/src/assets/i18n/en-US.json +3 -2
  100. package/src/assets/i18n/en.json +2 -1
  101. package/src/assets/i18n/fr.json +2 -1
  102. package/src/assets/manifest.json +1 -1
  103. package/src/theme/_mixins.scss +7 -0
  104. package/src/theme/_ngx-components.scss +53 -46
  105. package/src/theme/_ngx-components.table.scss +4 -1
  106. package/src/theme/_ngx-components.tabs.scss +11 -0
@@ -8,9 +8,10 @@ import { MarkdownService } from './markdown.service';
8
8
  import { Subscription } from 'rxjs';
9
9
  import { UrlUtils } from '../file/url.utils';
10
10
  import { isNotEmptyArray, isNotNilOrBlank } from '../functions';
11
- import { NavController } from '@ionic/angular';
11
+ import { NavController, ToastController } from '@ionic/angular';
12
12
  import { MarkdownUtils } from './markdown.utils';
13
13
  import { DOCUMENT } from '@angular/common';
14
+ import { PrintService } from '../print/print.service';
14
15
  import * as i0 from "@angular/core";
15
16
  import * as i1 from "@angular/router";
16
17
  import * as i2 from "@angular/common";
@@ -24,13 +25,15 @@ export class AppMarkdownContent {
24
25
  element;
25
26
  _document;
26
27
  route;
27
- _printIframe;
28
+ _printId;
28
29
  _clickSubscription;
29
30
  navController = inject(NavController);
30
31
  settings = inject(LocalSettingsService);
31
32
  translate = inject(TranslateService);
32
33
  network = inject(NetworkService);
33
34
  markdownService = inject(MarkdownService);
35
+ toastController = inject(ToastController);
36
+ printService = inject(PrintService);
34
37
  loading = true;
35
38
  error = undefined;
36
39
  baseUrl;
@@ -69,6 +72,8 @@ export class AppMarkdownContent {
69
72
  this.element = element;
70
73
  this._document = _document;
71
74
  this.route = route;
75
+ this._printId = this.printService.nextJobId();
76
+ this.markAsLoading({ emitEvent: false });
72
77
  // TODO: for DEV only
73
78
  //this.debug = !environment.production;
74
79
  }
@@ -92,29 +97,56 @@ export class AppMarkdownContent {
92
97
  get canGoBack() {
93
98
  return isNotEmptyArray(this._navHistory);
94
99
  }
95
- print(event) {
96
- console.debug('[markdown] Print');
100
+ async print() {
101
+ if (this.loading)
102
+ return; // skip
103
+ console.debug('[markdown] Print...');
97
104
  if (!this.element) {
98
- console.error('Erreur : Élément non trouvé.');
105
+ console.error('Element to print not found. Please check the HTML template.');
99
106
  return;
100
107
  }
101
- // Récupérer le contenu HTML depuis le composant
102
- const content = this.element.nativeElement.innerHTML;
103
- // Créer une iframe pour gérer l'impression
104
- this._printIframe = this.createPrintHiddenIframe(content);
105
- // Lancer l'impression après un court délai (le temps que l'iframe charge)
106
- this._printIframe.contentWindow.addEventListener('load', () => {
107
- this._printIframe.contentWindow?.window.print();
108
- this._printIframe.remove();
109
- });
108
+ this.markAsLoading({ emitEvent: false });
109
+ try {
110
+ // Print
111
+ await this.printService.printElement(this.element.nativeElement, {
112
+ id: this._printId,
113
+ // Print as portrait, by default
114
+ style: `@media print {
115
+ @page {
116
+ size: portrait;
117
+ margin: 1.1cm;
118
+ }
119
+ markdown hr {
120
+ page-break-before: always;
121
+ border: none;
122
+ margin: 0;
123
+ padding: 0;
124
+ }
125
+ markdown img {
126
+ max-width: 100%;
127
+ height: auto;
128
+ page-break-inside: avoid;
129
+ }
130
+ }`,
131
+ });
132
+ }
133
+ finally {
134
+ this.markAsLoaded({ emitEvent: false });
135
+ }
110
136
  }
111
- markAsLoaded() {
137
+ markAsLoaded(opts) {
112
138
  this.loading = false;
113
- this.cd.markForCheck();
139
+ if (opts?.emitEvent !== false) {
140
+ this.printService.markAsLoaded(this._printId);
141
+ this.cd.markForCheck();
142
+ }
114
143
  }
115
- markAsLoading() {
144
+ markAsLoading(opts) {
116
145
  this.loading = true;
117
- this.cd.markForCheck();
146
+ if (opts?.emitEvent !== false) {
147
+ this.printService.markAsLoading(this._printId);
148
+ this.cd.markForCheck();
149
+ }
118
150
  }
119
151
  setError(error) {
120
152
  this.error = error?.['message'] || error || null;
@@ -125,66 +157,6 @@ export class AppMarkdownContent {
125
157
  this.cd.markForCheck();
126
158
  }
127
159
  /* -- protected functions -- */
128
- createPrintHiddenIframe(html, style) {
129
- // Create a iframe with '?print-pdf'
130
- const iframe = this._document.createElement('iframe');
131
- iframe.classList.add('cdk-visually-hidden');
132
- iframe.style.width = '100%';
133
- iframe.style.height = '100%';
134
- this._document.body.appendChild(iframe);
135
- // Charger le contenu HTML dans l'iframe
136
- const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
137
- if (iframeDocument) {
138
- iframeDocument.open();
139
- iframeDocument.write(`
140
- <html>
141
- <head>
142
- <title>${this._document.title}</title>
143
- <style>
144
- hr {
145
- page-break-before: always;
146
- border: 0 !important;
147
- padding: 0 !important;
148
- }
149
- body {
150
- font-family: 'Roboto', Helvetica, Arial, sans-serif;
151
- margin: 0;
152
- padding: 20px;
153
- }
154
- </style>
155
- </head>
156
- <body>
157
- ${html}
158
- </body>
159
- </html>
160
- `);
161
- iframeDocument.close();
162
- }
163
- // Inject App style
164
- this.injectAppStylesIntoIframe(iframe);
165
- return iframe;
166
- }
167
- injectAppStylesIntoIframe(iframe) {
168
- const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
169
- if (iframeDocument) {
170
- // Récupérer tous les styles (liens CSS)
171
- const links = Array.from(this._document.querySelectorAll('link[rel="stylesheet"]'));
172
- links.forEach((link) => {
173
- const newLink = iframeDocument.createElement('link');
174
- newLink.rel = 'stylesheet';
175
- newLink.href = link.getAttribute('href');
176
- if (newLink.href)
177
- iframeDocument.head.appendChild(newLink);
178
- });
179
- // Récupérer tous les `styles` en ligne
180
- const inlineStyles = Array.from(this._document.querySelectorAll('style'));
181
- inlineStyles.forEach((style) => {
182
- const newStyle = iframeDocument.createElement('style');
183
- newStyle.innerHTML = style.innerHTML;
184
- iframeDocument.head.appendChild(newStyle);
185
- });
186
- }
187
- }
188
160
  setData(value, opts) {
189
161
  const anchor = opts?.anchor || null;
190
162
  if (this._data !== value || this._anchor !== anchor) {
@@ -216,7 +188,9 @@ export class AppMarkdownContent {
216
188
  // Clean URL (remove fragment and query)
217
189
  const anchor = opts?.anchor || UrlUtils.getFragment(src);
218
190
  src = UrlUtils.stripFragmentAndQuery(src);
191
+ src = MarkdownUtils.isGitlabUrl(src) ? MarkdownUtils.fixGitlabUrlToRaw(src) : src;
219
192
  let fallbackSrc = opts?.fallbackSrc ? UrlUtils.stripFragmentAndQuery(opts.fallbackSrc) : null;
193
+ fallbackSrc = MarkdownUtils.isGitlabUrl(fallbackSrc) ? MarkdownUtils.fixGitlabUrlToRaw(fallbackSrc) : fallbackSrc;
220
194
  if (this._src !== src || this._fallbackSrc !== fallbackSrc || this._anchor !== anchor) {
221
195
  const url = src ? src + (isNotNilOrBlank(anchor) ? `#${anchor}` : '') : null;
222
196
  if (url)
@@ -310,11 +284,11 @@ export class AppMarkdownContent {
310
284
  }));
311
285
  }
312
286
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownContent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: DOCUMENT }, { token: i1.ActivatedRoute, optional: true }], target: i0.ɵɵFactoryTarget.Component });
313
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownContent, selector: "app-markdown-content", inputs: { data: "data", src: "src", anchor: "anchor", debug: ["debug", "debug", booleanAttribute], showError: ["showError", "showError", booleanAttribute], animated: ["animated", "animated", booleanAttribute], enableNavigationHistory: ["enableNavigationHistory", "enableNavigationHistory", booleanAttribute], updateRouteLocation: ["updateRouteLocation", "updateRouteLocation", booleanAttribute] }, outputs: { markdownUrlChange: "markdownUrlChange" }, ngImport: i0, template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown hr{border-top:1px solid var(--ion-color-medium-tint, #dcdcde);margin:10px 0}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow: -4px 0px 0px rgba(var(--ion-text-color-rgb), .4);--ion-padding: 4px;display:block;position:relative;margin:var(--block-margin);padding:var(--block-padding);font-style:italic;background:var(--ion-color-light);box-shadow:var(--box-shadow)}:host ::ng-deep markdown code{color:rgba(var(--ion-text-color-rgb),.7);background:rgba(var(--ion-text-color-rgb),.03);font-size:.9rem;letter-spacing:-.5px}.loading-spinner ion-skeleton-text{width:100%;height:1.5em}.loading-spinner p{margin-top:var(ion-padding, 16px)}@media print{hr{page-break-before:always;border:none;margin:0}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin:0;padding:20px}}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: i5.DebugComponent, selector: "app-debug", inputs: ["titlePrefix", "title", "enable", "expanded"] }, { kind: "directive", type: i6.MarkdownDirective, selector: "markdown,[markdown]" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], animations: [slideDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
287
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownContent, selector: "app-markdown-content", inputs: { data: "data", src: "src", anchor: "anchor", debug: ["debug", "debug", booleanAttribute], showError: ["showError", "showError", booleanAttribute], animated: ["animated", "animated", booleanAttribute], enableNavigationHistory: ["enableNavigationHistory", "enableNavigationHistory", booleanAttribute], updateRouteLocation: ["updateRouteLocation", "updateRouteLocation", booleanAttribute] }, outputs: { markdownUrlChange: "markdownUrlChange" }, ngImport: i0, template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown hr{border-top:1px solid var(--ion-color-medium-tint, #dcdcde);margin:10px 0}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow: -4px 0px 0px rgba(var(--ion-text-color-rgb), .4);--ion-padding: 4px;display:block;position:relative;margin:var(--block-margin);padding:var(--block-padding);font-style:italic;background:var(--ion-color-light);box-shadow:var(--box-shadow)}:host ::ng-deep markdown code{color:rgba(var(--ion-text-color-rgb),.7);background:rgba(var(--ion-text-color-rgb),.03);font-size:.9rem;letter-spacing:-.5px}.loading-spinner ion-skeleton-text{width:100%;height:1.5em}.loading-spinner p{margin-top:var(ion-padding, 16px)}@media print{@page{size:portrait;margin:1.1cm}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin:0;padding:0;overflow:hidden}markdown hr{page-break-before:always;border:none;margin:0;padding:0}markdown img{max-width:100%;height:auto;page-break-inside:avoid}}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: i5.DebugComponent, selector: "app-debug", inputs: ["titlePrefix", "title", "enable", "expanded"] }, { kind: "directive", type: i6.MarkdownDirective, selector: "markdown,[markdown]" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], animations: [slideDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
314
288
  }
315
289
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownContent, decorators: [{
316
290
  type: Component,
317
- args: [{ selector: 'app-markdown-content', changeDetection: ChangeDetectionStrategy.OnPush, animations: [slideDownAnimation], template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown hr{border-top:1px solid var(--ion-color-medium-tint, #dcdcde);margin:10px 0}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow: -4px 0px 0px rgba(var(--ion-text-color-rgb), .4);--ion-padding: 4px;display:block;position:relative;margin:var(--block-margin);padding:var(--block-padding);font-style:italic;background:var(--ion-color-light);box-shadow:var(--box-shadow)}:host ::ng-deep markdown code{color:rgba(var(--ion-text-color-rgb),.7);background:rgba(var(--ion-text-color-rgb),.03);font-size:.9rem;letter-spacing:-.5px}.loading-spinner ion-skeleton-text{width:100%;height:1.5em}.loading-spinner p{margin-top:var(ion-padding, 16px)}@media print{hr{page-break-before:always;border:none;margin:0}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin:0;padding:20px}}\n"] }]
291
+ args: [{ selector: 'app-markdown-content', changeDetection: ChangeDetectionStrategy.OnPush, animations: [slideDownAnimation], template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown hr{border-top:1px solid var(--ion-color-medium-tint, #dcdcde);margin:10px 0}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow: -4px 0px 0px rgba(var(--ion-text-color-rgb), .4);--ion-padding: 4px;display:block;position:relative;margin:var(--block-margin);padding:var(--block-padding);font-style:italic;background:var(--ion-color-light);box-shadow:var(--box-shadow)}:host ::ng-deep markdown code{color:rgba(var(--ion-text-color-rgb),.7);background:rgba(var(--ion-text-color-rgb),.03);font-size:.9rem;letter-spacing:-.5px}.loading-spinner ion-skeleton-text{width:100%;height:1.5em}.loading-spinner p{margin-top:var(ion-padding, 16px)}@media print{@page{size:portrait;margin:1.1cm}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin:0;padding:0;overflow:hidden}markdown hr{page-break-before:always;border:none;margin:0;padding:0}markdown img{max-width:100%;height:auto;page-break-inside:avoid}}\n"] }]
318
292
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: Document, decorators: [{
319
293
  type: Inject,
320
294
  args: [DOCUMENT]
@@ -344,4 +318,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
344
318
  }], markdownUrlChange: [{
345
319
  type: Output
346
320
  }] } });
347
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7OztBQWUzQyxN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a0JBQWtCLG9IQTJDVCxnQkFBZ0IseUNBQ2hCLGdCQUFnQixzQ0FDaEIsZ0JBQWdCLG1GQUNoQixnQkFBZ0IsdUVBQ2hCLGdCQUFnQixrRkN4RnRDLCs1REF1REEseTlGRGhCYyxDQUFDLGtCQUFrQixDQUFDOzs0RkFFckIsa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLHNCQUFzQixtQkFHZix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLENBQUMsa0JBQWtCLENBQUM7OzBCQXdEN0IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixRQUFRO3lDQWpDRSxJQUFJO3NCQUFoQixLQUFLO2dCQU9PLEdBQUc7c0JBQWYsS0FBSztnQkFPTyxNQUFNO3NCQUFsQixLQUFLO2dCQU9rQyxLQUFLO3NCQUE1QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsUUFBUTtzQkFBL0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSx1QkFBdUI7c0JBQTlELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsbUJBQW1CO3NCQUExRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUU1QixpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgc2xpZGVEb3duQW5pbWF0aW9uIH0gZnJvbSAnLi4vbWF0ZXJpYWwvbWF0ZXJpYWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBNYXJrZG93blNlcnZpY2UgfSBmcm9tICcuL21hcmtkb3duLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVcmxVdGlscyB9IGZyb20gJy4uL2ZpbGUvdXJsLnV0aWxzJztcbmltcG9ydCB7IGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWxPckJsYW5rIH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7IE5hdkNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBNYXJrZG93blV0aWxzIH0gZnJvbSAnLi9tYXJrZG93bi51dGlscyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwTWFya2Rvd25PcHRpb25zIHtcbiAgZGF0YT86IHN0cmluZztcbiAgc3JjPzogc3RyaW5nO1xuICBzaG93RXJyb3I/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbWFya2Rvd24tY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXJrZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hcmtkb3duLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBhbmltYXRpb25zOiBbc2xpZGVEb3duQW5pbWF0aW9uXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwTWFya2Rvd25Db250ZW50IGltcGxlbWVudHMgQXBwTWFya2Rvd25PcHRpb25zLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9wcmludElmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQ7XG4gIHByaXZhdGUgX2NsaWNrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHJvdGVjdGVkIG5hdkNvbnRyb2xsZXIgPSBpbmplY3QoTmF2Q29udHJvbGxlcik7XG4gIHByb3RlY3RlZCBzZXR0aW5ncyA9IGluamVjdChMb2NhbFNldHRpbmdzU2VydmljZSk7XG4gIHByb3RlY3RlZCB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByb3RlY3RlZCBuZXR3b3JrID0gaW5qZWN0KE5ldHdvcmtTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIG1hcmtkb3duU2VydmljZSA9IGluamVjdChNYXJrZG93blNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCBsb2FkaW5nID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGVycm9yOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIGJhc2VVcmw6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX2RhdGE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zcmM6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9mYWxsYmFja1NyYzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2FuY2hvcjogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBfbmF2SGlzdG9yeTogeyBzcmM/OiBzdHJpbmc7IGZhbGxiYWNrU3JjPzogc3RyaW5nOyBkYXRhPzogc3RyaW5nOyBhbmNob3I/OiBzdHJpbmcgfVtdID0gW107XG5cbiAgQElucHV0KCkgc2V0IGRhdGEodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0RGF0YSh2YWx1ZSk7XG4gIH1cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc3JjKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFNyYyh2YWx1ZSk7XG4gIH1cbiAgZ2V0IHNyYygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3JjO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGFuY2hvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYW5jaG9yID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGFuY2hvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yO1xuICB9XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0Vycm9yID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGFuaW1hdGVkID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZU5hdmlnYXRpb25IaXN0b3J5ID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHVwZGF0ZVJvdXRlTG9jYXRpb24gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgbWFya2Rvd25VcmxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSAvLyBNb2RhbCBlZGl0b3IgZ2l2ZSAnbnVsbCdcbiAgKSB7XG4gICAgLy8gVE9ETzogZm9yIERFViBvbmx5XG4gICAgLy90aGlzLmRlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9jbGlja1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1hcmtkb3duU2VydmljZS5yZXNldEJhc2VVcmwoKTtcbiAgfVxuXG4gIGdvQmFjayhldmVudD86IEV2ZW50KSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW21hcmtkb3duXSBHb2luZyBiYWNrJyk7XG4gICAgaWYgKGlzTm90RW1wdHlBcnJheSh0aGlzLl9uYXZIaXN0b3J5KSkge1xuICAgICAgY29uc3QgeyBzcmMsIGZhbGxiYWNrU3JjLCBkYXRhLCBhbmNob3IgfSA9IHRoaXMuX25hdkhpc3RvcnkucG9wKCk7XG4gICAgICBpZiAoc3JjKSB0aGlzLnNldFNyYyhzcmMsIHsgZmFsbGJhY2tTcmMsIGFuY2hvciB9KTtcbiAgICAgIGVsc2UgdGhpcy5zZXREYXRhKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hdkNvbnRyb2xsZXIuYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjYW5Hb0JhY2soKSB7XG4gICAgcmV0dXJuIGlzTm90RW1wdHlBcnJheSh0aGlzLl9uYXZIaXN0b3J5KTtcbiAgfVxuXG4gIHByaW50KGV2ZW50PzogRXZlbnQpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbbWFya2Rvd25dIFByaW50Jyk7XG5cbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyZXVyIDogw4lsw6ltZW50IG5vbiB0cm91dsOpLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFLDqWN1cMOpcmVyIGxlIGNvbnRlbnUgSFRNTCBkZXB1aXMgbGUgY29tcG9zYW50XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcblxuICAgIC8vIENyw6llciB1bmUgaWZyYW1lIHBvdXIgZ8OpcmVyIGwnaW1wcmVzc2lvblxuICAgIHRoaXMuX3ByaW50SWZyYW1lID0gdGhpcy5jcmVhdGVQcmludEhpZGRlbklmcmFtZShjb250ZW50KTtcblxuICAgIC8vIExhbmNlciBsJ2ltcHJlc3Npb24gYXByw6hzIHVuIGNvdXJ0IGTDqWxhaSAobGUgdGVtcHMgcXVlIGwnaWZyYW1lIGNoYXJnZSlcbiAgICB0aGlzLl9wcmludElmcmFtZS5jb250ZW50V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICB0aGlzLl9wcmludElmcmFtZS5jb250ZW50V2luZG93Py53aW5kb3cucHJpbnQoKTtcbiAgICAgIHRoaXMuX3ByaW50SWZyYW1lLnJlbW92ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbWFya0FzTG9hZGVkKCkge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBtYXJrQXNMb2FkaW5nKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNldEVycm9yKGVycm9yOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHRoaXMuZXJyb3IgPSBlcnJvcj8uWydtZXNzYWdlJ10gfHwgZXJyb3IgfHwgbnVsbDtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVzZXRFcnJvcigpIHtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIHByaXZhdGUgY3JlYXRlUHJpbnRIaWRkZW5JZnJhbWUoaHRtbDogc3RyaW5nLCBzdHlsZT86IHN0cmluZyk6IEhUTUxJRnJhbWVFbGVtZW50IHtcbiAgICAvLyBDcmVhdGUgYSBpZnJhbWUgd2l0aCAnP3ByaW50LXBkZidcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZCgnY2RrLXZpc3VhbGx5LWhpZGRlbicpO1xuICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuICAgIC8vIENoYXJnZXIgbGUgY29udGVudSBIVE1MIGRhbnMgbCdpZnJhbWVcbiAgICBjb25zdCBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3c/LmRvY3VtZW50O1xuICAgIGlmIChpZnJhbWVEb2N1bWVudCkge1xuICAgICAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICAgICAgaWZyYW1lRG9jdW1lbnQud3JpdGUoYFxuICAgICAgICA8aHRtbD5cbiAgICAgICAgICA8aGVhZD5cbiAgICAgICAgICAgIDx0aXRsZT4ke3RoaXMuX2RvY3VtZW50LnRpdGxlfTwvdGl0bGU+XG4gICAgICAgICAgICA8c3R5bGU+XG4gICAgICAgICAgICBociB7XG4gICAgICAgICAgICAgIHBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXM7XG4gICAgICAgICAgICAgIGJvcmRlcjogMCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBib2R5IHtcbiAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgICA8L2hlYWQ+XG4gICAgICAgICAgPGJvZHk+XG4gICAgICAgICAgICAke2h0bWx9XG4gICAgICAgICAgPC9ib2R5PlxuICAgICAgICA8L2h0bWw+XG4gICAgICBgKTtcbiAgICAgIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IEFwcCBzdHlsZVxuICAgIHRoaXMuaW5qZWN0QXBwU3R5bGVzSW50b0lmcmFtZShpZnJhbWUpO1xuXG4gICAgcmV0dXJuIGlmcmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0QXBwU3R5bGVzSW50b0lmcmFtZShpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgY29uc3QgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93Py5kb2N1bWVudDtcblxuICAgIGlmIChpZnJhbWVEb2N1bWVudCkge1xuICAgICAgLy8gUsOpY3Vww6lyZXIgdG91cyBsZXMgc3R5bGVzIChsaWVucyBDU1MpXG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5fZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9XCJzdHlsZXNoZWV0XCJdJykpO1xuICAgICAgbGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgICBjb25zdCBuZXdMaW5rID0gaWZyYW1lRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBuZXdMaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgbmV3TGluay5ocmVmID0gbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgICAgaWYgKG5ld0xpbmsuaHJlZikgaWZyYW1lRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChuZXdMaW5rKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSw6ljdXDDqXJlciB0b3VzIGxlcyBgc3R5bGVzYCBlbiBsaWduZVxuICAgICAgY29uc3QgaW5saW5lU3R5bGVzID0gQXJyYXkuZnJvbSh0aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZScpKTtcbiAgICAgIGlubGluZVN0eWxlcy5mb3JFYWNoKChzdHlsZSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdTdHlsZSA9IGlmcmFtZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIG5ld1N0eWxlLmlubmVySFRNTCA9IHN0eWxlLmlubmVySFRNTDtcbiAgICAgICAgaWZyYW1lRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChuZXdTdHlsZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0RGF0YSh2YWx1ZTogc3RyaW5nLCBvcHRzPzogeyBhbmNob3I/OiBzdHJpbmc7IGFkZFRvTmF2aWdhdGlvbkhpc3Rvcnk/OiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBhbmNob3IgPSBvcHRzPy5hbmNob3IgfHwgbnVsbDtcblxuICAgIGlmICh0aGlzLl9kYXRhICE9PSB2YWx1ZSB8fCB0aGlzLl9hbmNob3IgIT09IGFuY2hvcikge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIC8vIFNhdmUgY3VycmVudCBzdGF0ZSB0byBuYXZpZ2F0aW9uIGhpc3RvcnlcbiAgICAgICAgaWYgKG9wdHM/LmFkZFRvTmF2aWdhdGlvbkhpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLl9uYXZIaXN0b3J5LnB1c2goe1xuICAgICAgICAgICAgc3JjOiB0aGlzLl9zcmMsXG4gICAgICAgICAgICBmYWxsYmFja1NyYzogdGhpcy5fZmFsbGJhY2tTcmMsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgYW5jaG9yOiB0aGlzLl9hbmNob3IsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kYXRhID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2FuY2hvciA9IGFuY2hvcjtcblxuICAgICAgICAvLyBDbGVhciBzcmNcbiAgICAgICAgdGhpcy5fc3JjID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZmFsbGJhY2tTcmMgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTcmMoc3JjOiBzdHJpbmcsIG9wdHM/OiB7IGZhbGxiYWNrU3JjPzogc3RyaW5nOyBhbmNob3I/OiBzdHJpbmc7IGFkZFRvTmF2aWdhdGlvbkhpc3Rvcnk/OiBib29sZWFuIH0pIHtcbiAgICAvLyBDbGVhbiBVUkwgKHJlbW92ZSBmcmFnbWVudCBhbmQgcXVlcnkpXG4gICAgY29uc3QgYW5jaG9yID0gb3B0cz8uYW5jaG9yIHx8IFVybFV0aWxzLmdldEZyYWdtZW50KHNyYyk7XG4gICAgc3JjID0gVXJsVXRpbHMuc3RyaXBGcmFnbWVudEFuZFF1ZXJ5KHNyYyk7XG4gICAgbGV0IGZhbGxiYWNrU3JjID0gb3B0cz8uZmFsbGJhY2tTcmMgPyBVcmxVdGlscy5zdHJpcEZyYWdtZW50QW5kUXVlcnkob3B0cy5mYWxsYmFja1NyYykgOiBudWxsO1xuXG4gICAgaWYgKHRoaXMuX3NyYyAhPT0gc3JjIHx8IHRoaXMuX2ZhbGxiYWNrU3JjICE9PSBmYWxsYmFja1NyYyB8fCB0aGlzLl9hbmNob3IgIT09IGFuY2hvcikge1xuICAgICAgY29uc3QgdXJsID0gc3JjID8gc3JjICsgKGlzTm90TmlsT3JCbGFuayhhbmNob3IpID8gYCMke2FuY2hvcn1gIDogJycpIDogbnVsbDtcbiAgICAgIGlmICh1cmwpIGNvbnNvbGUuZGVidWcoYFttYXJrZG93bl0gTG9hZGluZyAke3VybH0uLi5gKTtcblxuICAgICAgLy8gR2l2ZSBiYXNlVXJsIHRvIHRoZSBzZXJ2aWNlLCB0byBiZSBhYmxlIHRvIHJlc29sdmUgcmVsYXRpdmUgcGF0aCAtIGUuZy4gaW1hZ2VzKVxuICAgICAgaWYgKHNyYyAmJiBVcmxVdGlscy5pc0V4dGVybmFsVXJsKHNyYykpIHtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gVXJsVXRpbHMuZ2V0UGFyZW50KHNyYyk7XG4gICAgICAgIHRoaXMubWFya2Rvd25TZXJ2aWNlLnNldEJhc2VVcmwodGhpcy5iYXNlVXJsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYykge1xuICAgICAgICAvLyBTYXZlIGN1cnJlbnQgc3RhdGUgdG8gbmF2aWdhdGlvbiBoaXN0b3J5XG4gICAgICAgIGlmIChvcHRzPy5hZGRUb05hdmlnYXRpb25IaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5fbmF2SGlzdG9yeS5wdXNoKHtcbiAgICAgICAgICAgIHNyYzogdGhpcy5fc3JjLFxuICAgICAgICAgICAgZmFsbGJhY2tTcmM6IHRoaXMuX2ZhbGxiYWNrU3JjLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIGFuY2hvcjogdGhpcy5fYW5jaG9yLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3JjID0gc3JjO1xuICAgICAgICB0aGlzLl9mYWxsYmFja1NyYyA9IGZhbGxiYWNrU3JjO1xuICAgICAgICB0aGlzLl9hbmNob3IgPSBhbmNob3I7XG5cbiAgICAgICAgLy8gQ2xlYXIgZGF0YVxuICAgICAgICB0aGlzLl9kYXRhID0gbnVsbDtcblxuICAgICAgICAvLyBSZXNldCBlcnJvclxuICAgICAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICAgICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zcmMgPSBudWxsO1xuICAgICAgICB0aGlzLl9mYWxsYmFja1NyYyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FuY2hvciA9IG51bGw7XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUmVhZHkoKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5fc3JjID8gdGhpcy5fc3JjICsgKGlzTm90TmlsT3JCbGFuayh0aGlzLl9hbmNob3IpID8gYCMke3RoaXMuX2FuY2hvcn1gIDogJycpIDogbnVsbDtcblxuICAgIGlmICh1cmwpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFttYXJrZG93bl0gUmVhZHkgLSAke3VybH1gKTtcbiAgICAgIC8vIENsZWFyIGZhbGxiYWNrIChubyBtb3JlIG5lZWQpXG4gICAgICBpZiAodGhpcy5fZmFsbGJhY2tTcmMpIHRoaXMuX2ZhbGxiYWNrU3JjID0gbnVsbDtcblxuICAgICAgLy8gRW1pdCBjaGFuZ2VcbiAgICAgIHRoaXMubWFya2Rvd25VcmxDaGFuZ2UuZW1pdCh1cmwpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRMaXN0ZW5DbGlja0V2ZW50cygpO1xuXG4gICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcblxuICAgIC8vIFNjcm9sbCB0byBhbmNob3JcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKHRoaXMuX2FuY2hvcikpIHtcbiAgICAgIHRoaXMubWFya2Rvd25TZXJ2aWNlLnNjcm9sbFRvQW5jaG9yKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLl9hbmNob3IpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkxvYWRFcnJvcihlcnJvcj86IHN0cmluZyB8IEVycm9yKSB7XG4gICAgLy8gVHJhbnNsYXRlIGVycm9yXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgJiYgdGhpcy5uZXR3b3JrLm9mZmxpbmUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFttYXJrZG93bl0gRXJyb3IgbG9hZGluZyBtYXJrZG93biBVUkwgeyR7dGhpcy5zcmN9fSAob2ZmbGluZTogdHJ1ZSk6IGAsIGVycm9yKTtcbiAgICAgIHRoaXMuc2V0RXJyb3IoJ05FVFdPUksuSU5GTy5PRkZMSU5FJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldHJ5IHdpdGggZmFsbGJhY2sgVVJMXG4gICAgICBpZiAodGhpcy5fZmFsbGJhY2tTcmMpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgW21hcmtkb3duXSBFcnJvciBsb2FkaW5nIG1hcmtkb3duIFVSTCB7JHt0aGlzLnNyY319IC0gZmFsbGJhY2sgdG8gVVJMICR7dGhpcy5fZmFsbGJhY2tTcmN9YCk7XG4gICAgICAgIHRoaXMuc2V0U3JjKHRoaXMuX2ZhbGxiYWNrU3JjLCB7IGFuY2hvcjogdGhpcy5fYW5jaG9yIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoYFttYXJrZG93bl0gRXJyb3IgbG9hZGluZyBtYXJrZG93biBVUkwgeyR7dGhpcy5zcmN9fSAob2ZmbGluZTogdHJ1ZSk6IGAsIGVycm9yKTtcbiAgICAgIHRoaXMuc2V0RXJyb3IoJ0VSUk9SLkxPQURfREFUQV9FUlJPUicpO1xuICAgIH1cblxuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRMaXN0ZW5DbGlja0V2ZW50cygpIHtcbiAgICB0aGlzLl9jbGlja1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9jbGlja1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8vIExpc3RlbiBmb3IgY2xpY2sgbGluayB0byBNYXJrZG93biBVUkxcbiAgICB0aGlzLl9jbGlja1N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLm1hcmtkb3duU2VydmljZS5vbkNsaWNrTWFya2Rvd25Vcmwuc3Vic2NyaWJlKChocmVmKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1ttYXJrZG93bl0gUmVjZWl2ZWQgY2xpY2sgZXZlbnQsIG9uIGEgbWFya2Rvd24gVVJMJywgaHJlZik7XG5cbiAgICAgICAgbGV0IGZyYWdtZW50ID0gVXJsVXRpbHMuZ2V0RnJhZ21lbnQoaHJlZik7XG4gICAgICAgIGxldCB1cmwgPSBVcmxVdGlscy5zdHJpcEZyYWdtZW50QW5kUXVlcnkoaHJlZik7XG4gICAgICAgIGxldCBmYWxsYmFja1VybCA9IG51bGw7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBwYXRoXG4gICAgICAgIGlmIChVcmxVdGlscy5pc1JlbGF0aXZlVXJsKGhyZWYpICYmIHRoaXMuYmFzZVVybCkge1xuICAgICAgICAgIC8vIEdldCBhYnNvbHV0ZSB1cmxcbiAgICAgICAgICB1cmwgPSBNYXJrZG93blV0aWxzLnJlc29sdmVSZWxhdGl2ZVVybCh0aGlzLmJhc2VVcmwsIGhyZWYpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgZmFsbGJhY2sgdXJsLCBpbiByZWxhdGl2ZSBwYXRoIHdhcyB3cm9uZ1xuICAgICAgICAgIGZhbGxiYWNrVXJsID0gTWFya2Rvd25VdGlscy5yZXNvbHZlUmVsYXRpdmVVcmwodGhpcy5iYXNlVXJsLCBocmVmLCB7IGFic29sdXRlQnlEZWZhdWx0OiB0cnVlIH0pO1xuICAgICAgICAgIGZhbGxiYWNrVXJsID0gdXJsID09PSBmYWxsYmFja1VybCA/IG51bGwgOiBmYWxsYmFja1VybDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wZW5pbmcgdGhlIG5ldyBVUkxcbiAgICAgICAgdGhpcy5zZXRTcmModXJsLCB7IGZhbGxiYWNrU3JjOiBmYWxsYmFja1VybCwgYW5jaG9yOiBmcmFnbWVudCwgYWRkVG9OYXZpZ2F0aW9uSGlzdG9yeTogdGhpcy5lbmFibGVOYXZpZ2F0aW9uSGlzdG9yeSB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGFwcC1kZWJ1ZyAqbmdJZj1cImRlYnVnXCI+XG4gIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aW9uLWNvbD5cbiAgICAgICAgbG9hZGluZzoge3sgbG9hZGluZyB9fVxuICAgICAgICA8YnIgLz5cbiAgICAgICAgZXJyb3I6IHt7IGVycm9yIH19XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgYmFzZVVybDoge3sgYmFzZVVybCB9fVxuICAgICAgICA8YnIgLz5cbiAgICAgICAgbWFya2Rvd25Vcmw6IHt7IHNyYyB9fVxuICAgICAgICA8YnIgLz5cbiAgICAgICAgbWFya2Rvd25GcmFnbWVudDoge3sgX2FuY2hvciB9fVxuICAgICAgICA8YnIgLz5cbiAgICAgICAgbWFya2Rvd25Db250ZW50OiB7eyBkYXRhIH19XG4gICAgICAgIDxiciAvPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cbjwvYXBwLWRlYnVnPlxuXG48IS0tIGVycm9yIC0tPlxuQGlmIChzaG93RXJyb3IgJiYgZXJyb3I7IGFzIGVycm9yKSB7XG4gIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIiBAc2xpZGVEb3duQW5pbWF0aW9uPlxuICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySFRNTF09XCJlcnJvciB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICA8L2lvbi1pdGVtPlxufSBAZWxzZSB7XG4gIEBpZiAoZGF0YSkge1xuICAgIDxtYXJrZG93biBbZGF0YV09XCJkYXRhXCIgKHJlYWR5KT1cIm9uUmVhZHkoKVwiIGVtb2ppPjwvbWFya2Rvd24+XG4gIH0gQGVsc2UgaWYgKHNyYykge1xuICAgIDxtYXJrZG93biBbc3JjXT1cInNyY1wiIChlcnJvcik9XCJvbkxvYWRFcnJvcigkZXZlbnQpXCIgKHJlYWR5KT1cIm9uUmVhZHkoKVwiIGVtb2ppPjwvbWFya2Rvd24+XG4gIH1cbn1cblxuPCEtLSBsb2FkaW5nIHNwaW5uZXIgLS0+XG5AaWYgKGxvYWRpbmcpIHtcbiAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nUGFyYWdyYXBoXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdQYXJhZ3JhcGhcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1BhcmFncmFwaFwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbn1cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nUGFyYWdyYXBoPlxuICA8cD5cbiAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cImFuaW1hdGVkXCIgc3R5bGU9XCJ3aWR0aDogNzUlOyBtYXJnaW4taW5saW5lLXN0YXJ0OiA1JVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJhbmltYXRlZFwiIHN0eWxlPVwid2lkdGg6IDgwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJhbmltYXRlZFwiIHN0eWxlPVwid2lkdGg6IDgwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJhbmltYXRlZFwiIHN0eWxlPVwid2lkdGg6IDgwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJhbmltYXRlZFwiIHN0eWxlPVwid2lkdGg6IDgwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJhbmltYXRlZFwiIHN0eWxlPVwid2lkdGg6IDgwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gIDwvcD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBZXRELE1BQU0sT0FBTyxrQkFBa0I7SUFzRGpCO0lBQ0E7SUFDZ0I7SUFDSjtJQXhEaEIsUUFBUSxDQUFTO0lBQ2pCLGtCQUFrQixDQUFlO0lBRS9CLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXBDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDZixLQUFLLEdBQVcsU0FBUyxDQUFDO0lBRTFCLE9BQU8sQ0FBUztJQUVoQixLQUFLLENBQVM7SUFDZCxJQUFJLENBQVM7SUFDYixZQUFZLENBQVM7SUFDckIsT0FBTyxDQUFTO0lBRWhCLFdBQVcsR0FBNkUsRUFBRSxDQUFDO0lBRXJHLElBQWEsSUFBSSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFhLEdBQUcsQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBYSxNQUFNLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFdUMsS0FBSyxDQUFVO0lBQ2YsU0FBUyxHQUFHLElBQUksQ0FBQztJQUNqQixRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2hCLHVCQUF1QixHQUFHLElBQUksQ0FBQztJQUMvQixtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFFMUQsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUV6RCxZQUNZLEVBQXFCLEVBQ3JCLE9BQWdDLEVBQ2hCLFNBQW1CLEVBQ3ZCLEtBQXFCLENBQUMsMkJBQTJCOztRQUg3RCxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUNoQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ3ZCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBRTNDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFekMscUJBQXFCO1FBQ3JCLHVDQUF1QztJQUN6QyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBYTtRQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDdkMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbEUsSUFBSSxHQUFHO2dCQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7O2dCQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxDQUFDLE9BQU87UUFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1lBQzdFLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQztZQUNILFFBQVE7WUFDUixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO2dCQUMvRCxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBRWpCLGdDQUFnQztnQkFDaEMsS0FBSyxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7O1VBZ0JMO2FBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQThCO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksSUFBSSxFQUFFLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUE4QjtRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVwQixJQUFJLElBQUksRUFBRSxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRS9DLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsS0FBcUI7UUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ2pELElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCwrQkFBK0I7SUFFckIsT0FBTyxDQUFDLEtBQWEsRUFBRSxJQUE0RDtRQUMzRixNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDcEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDViwyQ0FBMkM7Z0JBQzNDLElBQUksSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO3dCQUNwQixHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2QsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO3dCQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztxQkFDckIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUV0QixZQUFZO2dCQUNaLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFFekIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRVMsTUFBTSxDQUFDLEdBQVcsRUFBRSxJQUFrRjtRQUM5Ryx3Q0FBd0M7UUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLE1BQU0sSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELEdBQUcsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRWxGLElBQUksV0FBVyxHQUFHLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM5RixXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFFbEgsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RGLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzdFLElBQUksR0FBRztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxDQUFDO1lBRXZELGtGQUFrRjtZQUNsRixJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLDJDQUEyQztnQkFDM0MsSUFBSSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDZCxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7d0JBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSzt3QkFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO3FCQUNyQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUV0QixhQUFhO2dCQUNiLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUVsQixjQUFjO2dCQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVTLE9BQU87UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFckcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0MsZ0NBQWdDO1lBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVk7Z0JBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFFaEQsY0FBYztZQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixtQkFBbUI7UUFDbkIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hGLENBQUM7SUFDSCxDQUFDO0lBRVMsV0FBVyxDQUFDLEtBQXNCO1FBQzFDLGtCQUFrQjtRQUNsQixJQUFJLEtBQUssWUFBWSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlGLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLDBCQUEwQjtZQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsSUFBSSxDQUFDLEdBQUcsdUJBQXVCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3pELE9BQU87WUFDVCxDQUFDO1lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsSUFBSSxDQUFDLEdBQUcscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLHNCQUFzQjtRQUM5QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFN0Msd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekQsT0FBTyxDQUFDLEtBQUssQ0FBQyxvREFBb0QsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUxRSxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFFdkIsd0JBQXdCO1lBQ3hCLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pELG1CQUFtQjtnQkFDbkIsR0FBRyxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUUzRCxvREFBb0Q7Z0JBQ3BELFdBQVcsR0FBRyxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRyxXQUFXLEdBQUcsR0FBRyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDekQsQ0FBQztZQUVELHNCQUFzQjtZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO3dHQWxUVSxrQkFBa0IsNkVBd0RuQixRQUFROzRGQXhEUCxrQkFBa0Isb0hBNkNULGdCQUFnQix5Q0FDaEIsZ0JBQWdCLHNDQUNoQixnQkFBZ0IsbUZBQ2hCLGdCQUFnQix1RUFDaEIsZ0JBQWdCLGtGQzNGdEMsKzVEQXVEQSwwbEdEZmMsQ0FBQyxrQkFBa0IsQ0FBQzs7NEZBRXJCLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDRSxzQkFBc0IsbUJBR2YsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxDQUFDLGtCQUFrQixDQUFDOzswQkEwRDdCLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsUUFBUTt5Q0FqQ0UsSUFBSTtzQkFBaEIsS0FBSztnQkFPTyxHQUFHO3NCQUFmLEtBQUs7Z0JBT08sTUFBTTtzQkFBbEIsS0FBSztnQkFPa0MsS0FBSztzQkFBNUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxTQUFTO3NCQUFoRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsdUJBQXVCO3NCQUE5RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLG1CQUFtQjtzQkFBMUQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFNUIsaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IHNsaWRlRG93bkFuaW1hdGlvbiB9IGZyb20gJy4uL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgTWFya2Rvd25TZXJ2aWNlIH0gZnJvbSAnLi9tYXJrZG93bi5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVXJsVXRpbHMgfSBmcm9tICcuLi9maWxlL3VybC51dGlscyc7XG5pbXBvcnQgeyBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBOYXZDb250cm9sbGVyLCBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBNYXJrZG93blV0aWxzIH0gZnJvbSAnLi9tYXJrZG93bi51dGlscyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQcmludFNlcnZpY2UgfSBmcm9tICcuLi9wcmludC9wcmludC5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBBcHBNYXJrZG93bk9wdGlvbnMge1xuICBkYXRhPzogc3RyaW5nO1xuICBzcmM/OiBzdHJpbmc7XG4gIHNob3dFcnJvcj86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1tYXJrZG93bi1jb250ZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcmtkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWFya2Rvd24uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtzbGlkZURvd25BbmltYXRpb25dLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBNYXJrZG93bkNvbnRlbnQgaW1wbGVtZW50cyBBcHBNYXJrZG93bk9wdGlvbnMsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX3ByaW50SWQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfY2xpY2tTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgbmF2Q29udHJvbGxlciA9IGluamVjdChOYXZDb250cm9sbGVyKTtcbiAgcHJvdGVjdGVkIHNldHRpbmdzID0gaW5qZWN0KExvY2FsU2V0dGluZ3NTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIG5ldHdvcmsgPSBpbmplY3QoTmV0d29ya1NlcnZpY2UpO1xuICBwcm90ZWN0ZWQgbWFya2Rvd25TZXJ2aWNlID0gaW5qZWN0KE1hcmtkb3duU2VydmljZSk7XG4gIHByb3RlY3RlZCB0b2FzdENvbnRyb2xsZXIgPSBpbmplY3QoVG9hc3RDb250cm9sbGVyKTtcbiAgcHJvdGVjdGVkIHByaW50U2VydmljZSA9IGluamVjdChQcmludFNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCBsb2FkaW5nID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGVycm9yOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIGJhc2VVcmw6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX2RhdGE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zcmM6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9mYWxsYmFja1NyYzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2FuY2hvcjogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBfbmF2SGlzdG9yeTogeyBzcmM/OiBzdHJpbmc7IGZhbGxiYWNrU3JjPzogc3RyaW5nOyBkYXRhPzogc3RyaW5nOyBhbmNob3I/OiBzdHJpbmcgfVtdID0gW107XG5cbiAgQElucHV0KCkgc2V0IGRhdGEodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0RGF0YSh2YWx1ZSk7XG4gIH1cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc3JjKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFNyYyh2YWx1ZSk7XG4gIH1cbiAgZ2V0IHNyYygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3JjO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGFuY2hvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYW5jaG9yID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGFuY2hvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yO1xuICB9XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0Vycm9yID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGFuaW1hdGVkID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZU5hdmlnYXRpb25IaXN0b3J5ID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHVwZGF0ZVJvdXRlTG9jYXRpb24gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgbWFya2Rvd25VcmxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSAvLyBNb2RhbCBlZGl0b3IgZ2l2ZSAnbnVsbCdcbiAgKSB7XG4gICAgdGhpcy5fcHJpbnRJZCA9IHRoaXMucHJpbnRTZXJ2aWNlLm5leHRKb2JJZCgpO1xuICAgIHRoaXMubWFya0FzTG9hZGluZyh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAvLyBUT0RPOiBmb3IgREVWIG9ubHlcbiAgICAvL3RoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NsaWNrU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWFya2Rvd25TZXJ2aWNlLnJlc2V0QmFzZVVybCgpO1xuICB9XG5cbiAgZ29CYWNrKGV2ZW50PzogRXZlbnQpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbbWFya2Rvd25dIEdvaW5nIGJhY2snKTtcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMuX25hdkhpc3RvcnkpKSB7XG4gICAgICBjb25zdCB7IHNyYywgZmFsbGJhY2tTcmMsIGRhdGEsIGFuY2hvciB9ID0gdGhpcy5fbmF2SGlzdG9yeS5wb3AoKTtcbiAgICAgIGlmIChzcmMpIHRoaXMuc2V0U3JjKHNyYywgeyBmYWxsYmFja1NyYywgYW5jaG9yIH0pO1xuICAgICAgZWxzZSB0aGlzLnNldERhdGEoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmF2Q29udHJvbGxlci5iYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNhbkdvQmFjaygpIHtcbiAgICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KHRoaXMuX25hdkhpc3RvcnkpO1xuICB9XG5cbiAgYXN5bmMgcHJpbnQoKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuOyAvLyBza2lwXG4gICAgY29uc29sZS5kZWJ1ZygnW21hcmtkb3duXSBQcmludC4uLicpO1xuXG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0VsZW1lbnQgdG8gcHJpbnQgbm90IGZvdW5kLiBQbGVhc2UgY2hlY2sgdGhlIEhUTUwgdGVtcGxhdGUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBQcmludFxuICAgICAgYXdhaXQgdGhpcy5wcmludFNlcnZpY2UucHJpbnRFbGVtZW50KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIGlkOiB0aGlzLl9wcmludElkLFxuXG4gICAgICAgIC8vIFByaW50IGFzIHBvcnRyYWl0LCBieSBkZWZhdWx0XG4gICAgICAgIHN0eWxlOiBgQG1lZGlhIHByaW50IHtcbiAgICAgICAgICBAcGFnZSB7XG4gICAgICAgICAgICBzaXplOiBwb3J0cmFpdDtcbiAgICAgICAgICAgIG1hcmdpbjogMS4xY207XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcmtkb3duIGhyIHtcbiAgICAgICAgICAgIHBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXM7XG4gICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXJrZG93biBpbWcge1xuICAgICAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgICAgICAgIH1cbiAgICAgICAgfWAsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRlZChvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgIGlmIChvcHRzPy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnByaW50U2VydmljZS5tYXJrQXNMb2FkZWQodGhpcy5fcHJpbnRJZCk7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRpbmcob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIGlmIChvcHRzPy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnByaW50U2VydmljZS5tYXJrQXNMb2FkaW5nKHRoaXMuX3ByaW50SWQpO1xuXG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHNldEVycm9yKGVycm9yOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHRoaXMuZXJyb3IgPSBlcnJvcj8uWydtZXNzYWdlJ10gfHwgZXJyb3IgfHwgbnVsbDtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVzZXRFcnJvcigpIHtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIHByb3RlY3RlZCBzZXREYXRhKHZhbHVlOiBzdHJpbmcsIG9wdHM/OiB7IGFuY2hvcj86IHN0cmluZzsgYWRkVG9OYXZpZ2F0aW9uSGlzdG9yeT86IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IGFuY2hvciA9IG9wdHM/LmFuY2hvciB8fCBudWxsO1xuXG4gICAgaWYgKHRoaXMuX2RhdGEgIT09IHZhbHVlIHx8IHRoaXMuX2FuY2hvciAhPT0gYW5jaG9yKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgLy8gU2F2ZSBjdXJyZW50IHN0YXRlIHRvIG5hdmlnYXRpb24gaGlzdG9yeVxuICAgICAgICBpZiAob3B0cz8uYWRkVG9OYXZpZ2F0aW9uSGlzdG9yeSkge1xuICAgICAgICAgIHRoaXMuX25hdkhpc3RvcnkucHVzaCh7XG4gICAgICAgICAgICBzcmM6IHRoaXMuX3NyYyxcbiAgICAgICAgICAgIGZhbGxiYWNrU3JjOiB0aGlzLl9mYWxsYmFja1NyYyxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuX2RhdGEsXG4gICAgICAgICAgICBhbmNob3I6IHRoaXMuX2FuY2hvcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fYW5jaG9yID0gYW5jaG9yO1xuXG4gICAgICAgIC8vIENsZWFyIHNyY1xuICAgICAgICB0aGlzLl9zcmMgPSBudWxsO1xuICAgICAgICB0aGlzLl9mYWxsYmFja1NyYyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldFNyYyhzcmM6IHN0cmluZywgb3B0cz86IHsgZmFsbGJhY2tTcmM/OiBzdHJpbmc7IGFuY2hvcj86IHN0cmluZzsgYWRkVG9OYXZpZ2F0aW9uSGlzdG9yeT86IGJvb2xlYW4gfSkge1xuICAgIC8vIENsZWFuIFVSTCAocmVtb3ZlIGZyYWdtZW50IGFuZCBxdWVyeSlcbiAgICBjb25zdCBhbmNob3IgPSBvcHRzPy5hbmNob3IgfHwgVXJsVXRpbHMuZ2V0RnJhZ21lbnQoc3JjKTtcbiAgICBzcmMgPSBVcmxVdGlscy5zdHJpcEZyYWdtZW50QW5kUXVlcnkoc3JjKTtcbiAgICBzcmMgPSBNYXJrZG93blV0aWxzLmlzR2l0bGFiVXJsKHNyYykgPyBNYXJrZG93blV0aWxzLmZpeEdpdGxhYlVybFRvUmF3KHNyYykgOiBzcmM7XG5cbiAgICBsZXQgZmFsbGJhY2tTcmMgPSBvcHRzPy5mYWxsYmFja1NyYyA/IFVybFV0aWxzLnN0cmlwRnJhZ21lbnRBbmRRdWVyeShvcHRzLmZhbGxiYWNrU3JjKSA6IG51bGw7XG4gICAgZmFsbGJhY2tTcmMgPSBNYXJrZG93blV0aWxzLmlzR2l0bGFiVXJsKGZhbGxiYWNrU3JjKSA/IE1hcmtkb3duVXRpbHMuZml4R2l0bGFiVXJsVG9SYXcoZmFsbGJhY2tTcmMpIDogZmFsbGJhY2tTcmM7XG5cbiAgICBpZiAodGhpcy5fc3JjICE9PSBzcmMgfHwgdGhpcy5fZmFsbGJhY2tTcmMgIT09IGZhbGxiYWNrU3JjIHx8IHRoaXMuX2FuY2hvciAhPT0gYW5jaG9yKSB7XG4gICAgICBjb25zdCB1cmwgPSBzcmMgPyBzcmMgKyAoaXNOb3ROaWxPckJsYW5rKGFuY2hvcikgPyBgIyR7YW5jaG9yfWAgOiAnJykgOiBudWxsO1xuICAgICAgaWYgKHVybCkgY29uc29sZS5kZWJ1ZyhgW21hcmtkb3duXSBMb2FkaW5nICR7dXJsfS4uLmApO1xuXG4gICAgICAvLyBHaXZlIGJhc2VVcmwgdG8gdGhlIHNlcnZpY2UsIHRvIGJlIGFibGUgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRoIC0gZS5nLiBpbWFnZXMpXG4gICAgICBpZiAoc3JjICYmIFVybFV0aWxzLmlzRXh0ZXJuYWxVcmwoc3JjKSkge1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBVcmxVdGlscy5nZXRQYXJlbnQoc3JjKTtcbiAgICAgICAgdGhpcy5tYXJrZG93blNlcnZpY2Uuc2V0QmFzZVVybCh0aGlzLmJhc2VVcmwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3JjKSB7XG4gICAgICAgIC8vIFNhdmUgY3VycmVudCBzdGF0ZSB0byBuYXZpZ2F0aW9uIGhpc3RvcnlcbiAgICAgICAgaWYgKG9wdHM/LmFkZFRvTmF2aWdhdGlvbkhpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLl9uYXZIaXN0b3J5LnB1c2goe1xuICAgICAgICAgICAgc3JjOiB0aGlzLl9zcmMsXG4gICAgICAgICAgICBmYWxsYmFja1NyYzogdGhpcy5fZmFsbGJhY2tTcmMsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgYW5jaG9yOiB0aGlzLl9hbmNob3IsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zcmMgPSBzcmM7XG4gICAgICAgIHRoaXMuX2ZhbGxiYWNrU3JjID0gZmFsbGJhY2tTcmM7XG4gICAgICAgIHRoaXMuX2FuY2hvciA9IGFuY2hvcjtcblxuICAgICAgICAvLyBDbGVhciBkYXRhXG4gICAgICAgIHRoaXMuX2RhdGEgPSBudWxsO1xuXG4gICAgICAgIC8vIFJlc2V0IGVycm9yXG4gICAgICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgICAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NyYyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2ZhbGxiYWNrU3JjID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYW5jaG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25SZWFkeSgpIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLl9zcmMgPyB0aGlzLl9zcmMgKyAoaXNOb3ROaWxPckJsYW5rKHRoaXMuX2FuY2hvcikgPyBgIyR7dGhpcy5fYW5jaG9yfWAgOiAnJykgOiBudWxsO1xuXG4gICAgaWYgKHVybCkge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgW21hcmtkb3duXSBSZWFkeSAtICR7dXJsfWApO1xuICAgICAgLy8gQ2xlYXIgZmFsbGJhY2sgKG5vIG1vcmUgbmVlZClcbiAgICAgIGlmICh0aGlzLl9mYWxsYmFja1NyYykgdGhpcy5fZmFsbGJhY2tTcmMgPSBudWxsO1xuXG4gICAgICAvLyBFbWl0IGNoYW5nZVxuICAgICAgdGhpcy5tYXJrZG93blVybENoYW5nZS5lbWl0KHVybCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydExpc3RlbkNsaWNrRXZlbnRzKCk7XG5cbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuXG4gICAgLy8gU2Nyb2xsIHRvIGFuY2hvclxuICAgIGlmIChpc05vdE5pbE9yQmxhbmsodGhpcy5fYW5jaG9yKSkge1xuICAgICAgdGhpcy5tYXJrZG93blNlcnZpY2Uuc2Nyb2xsVG9BbmNob3IodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2FuY2hvcik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uTG9hZEVycm9yKGVycm9yPzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICAvLyBUcmFuc2xhdGUgZXJyb3JcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLm5ldHdvcmsub2ZmbGluZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW21hcmtkb3duXSBFcnJvciBsb2FkaW5nIG1hcmtkb3duIFVSTCB7JHt0aGlzLnNyY319IChvZmZsaW5lOiB0cnVlKTogYCwgZXJyb3IpO1xuICAgICAgdGhpcy5zZXRFcnJvcignTkVUV09SSy5JTkZPLk9GRkxJTkUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV0cnkgd2l0aCBmYWxsYmFjayBVUkxcbiAgICAgIGlmICh0aGlzLl9mYWxsYmFja1NyYykge1xuICAgICAgICBjb25zb2xlLmRlYnVnKGBbbWFya2Rvd25dIEVycm9yIGxvYWRpbmcgbWFya2Rvd24gVVJMIHske3RoaXMuc3JjfX0gLSBmYWxsYmFjayB0byBVUkwgJHt0aGlzLl9mYWxsYmFja1NyY31gKTtcbiAgICAgICAgdGhpcy5zZXRTcmModGhpcy5fZmFsbGJhY2tTcmMsIHsgYW5jaG9yOiB0aGlzLl9hbmNob3IgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5lcnJvcihgW21hcmtkb3duXSBFcnJvciBsb2FkaW5nIG1hcmtkb3duIFVSTCB7JHt0aGlzLnNyY319IChvZmZsaW5lOiB0cnVlKTogYCwgZXJyb3IpO1xuICAgICAgdGhpcy5zZXRFcnJvcignRVJST1IuTE9BRF9EQVRBX0VSUk9SJyk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydExpc3RlbkNsaWNrRXZlbnRzKCkge1xuICAgIHRoaXMuX2NsaWNrU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2NsaWNrU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjbGljayBsaW5rIHRvIE1hcmtkb3duIFVSTFxuICAgIHRoaXMuX2NsaWNrU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubWFya2Rvd25TZXJ2aWNlLm9uQ2xpY2tNYXJrZG93blVybC5zdWJzY3JpYmUoKGhyZWYpID0+IHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW21hcmtkb3duXSBSZWNlaXZlZCBjbGljayBldmVudCwgb24gYSBtYXJrZG93biBVUkwnLCBocmVmKTtcblxuICAgICAgICBsZXQgZnJhZ21lbnQgPSBVcmxVdGlscy5nZXRGcmFnbWVudChocmVmKTtcbiAgICAgICAgbGV0IHVybCA9IFVybFV0aWxzLnN0cmlwRnJhZ21lbnRBbmRRdWVyeShocmVmKTtcbiAgICAgICAgbGV0IGZhbGxiYWNrVXJsID0gbnVsbDtcblxuICAgICAgICAvLyBSZXNvbHZlIHJlbGF0aXZlIHBhdGhcbiAgICAgICAgaWYgKFVybFV0aWxzLmlzUmVsYXRpdmVVcmwoaHJlZikgJiYgdGhpcy5iYXNlVXJsKSB7XG4gICAgICAgICAgLy8gR2V0IGFic29sdXRlIHVybFxuICAgICAgICAgIHVybCA9IE1hcmtkb3duVXRpbHMucmVzb2x2ZVJlbGF0aXZlVXJsKHRoaXMuYmFzZVVybCwgaHJlZik7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSBmYWxsYmFjayB1cmwsIGluIHJlbGF0aXZlIHBhdGggd2FzIHdyb25nXG4gICAgICAgICAgZmFsbGJhY2tVcmwgPSBNYXJrZG93blV0aWxzLnJlc29sdmVSZWxhdGl2ZVVybCh0aGlzLmJhc2VVcmwsIGhyZWYsIHsgYWJzb2x1dGVCeURlZmF1bHQ6IHRydWUgfSk7XG4gICAgICAgICAgZmFsbGJhY2tVcmwgPSB1cmwgPT09IGZhbGxiYWNrVXJsID8gbnVsbCA6IGZhbGxiYWNrVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3BlbmluZyB0aGUgbmV3IFVSTFxuICAgICAgICB0aGlzLnNldFNyYyh1cmwsIHsgZmFsbGJhY2tTcmM6IGZhbGxiYWNrVXJsLCBhbmNob3I6IGZyYWdtZW50LCBhZGRUb05hdmlnYXRpb25IaXN0b3J5OiB0aGlzLmVuYWJsZU5hdmlnYXRpb25IaXN0b3J5IH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCI8YXBwLWRlYnVnICpuZ0lmPVwiZGVidWdcIj5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sPlxuICAgICAgICBsb2FkaW5nOiB7eyBsb2FkaW5nIH19XG4gICAgICAgIDxiciAvPlxuICAgICAgICBlcnJvcjoge3sgZXJyb3IgfX1cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIDxiciAvPlxuICAgICAgICBiYXNlVXJsOiB7eyBiYXNlVXJsIH19XG4gICAgICAgIDxiciAvPlxuICAgICAgICBtYXJrZG93blVybDoge3sgc3JjIH19XG4gICAgICAgIDxiciAvPlxuICAgICAgICBtYXJrZG93bkZyYWdtZW50OiB7eyBfYW5jaG9yIH19XG4gICAgICAgIDxiciAvPlxuICAgICAgICBtYXJrZG93bkNvbnRlbnQ6IHt7IGRhdGEgfX1cbiAgICAgICAgPGJyIC8+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi1ncmlkPlxuPC9hcHAtZGVidWc+XG5cbjwhLS0gZXJyb3IgLS0+XG5AaWYgKHNob3dFcnJvciAmJiBlcnJvcjsgYXMgZXJyb3IpIHtcbiAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiIEBzbGlkZURvd25BbmltYXRpb24+XG4gICAgPGlvbi1pY29uIGNvbG9yPVwiZGFuZ2VyXCIgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImFsZXJ0LWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIVE1MXT1cImVycm9yIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG59IEBlbHNlIHtcbiAgQGlmIChkYXRhKSB7XG4gICAgPG1hcmtkb3duIFtkYXRhXT1cImRhdGFcIiAocmVhZHkpPVwib25SZWFkeSgpXCIgZW1vamk+PC9tYXJrZG93bj5cbiAgfSBAZWxzZSBpZiAoc3JjKSB7XG4gICAgPG1hcmtkb3duIFtzcmNdPVwic3JjXCIgKGVycm9yKT1cIm9uTG9hZEVycm9yKCRldmVudClcIiAocmVhZHkpPVwib25SZWFkeSgpXCIgZW1vamk+PC9tYXJrZG93bj5cbiAgfVxufVxuXG48IS0tIGxvYWRpbmcgc3Bpbm5lciAtLT5cbkBpZiAobG9hZGluZykge1xuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdQYXJhZ3JhcGhcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1BhcmFncmFwaFwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nUGFyYWdyYXBoXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxufVxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdQYXJhZ3JhcGg+XG4gIDxwPlxuICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwiYW5pbWF0ZWRcIiBzdHlsZT1cIndpZHRoOiA3NSU7IG1hcmdpbi1pbmxpbmUtc3RhcnQ6IDUlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cImFuaW1hdGVkXCIgc3R5bGU9XCJ3aWR0aDogODAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cImFuaW1hdGVkXCIgc3R5bGU9XCJ3aWR0aDogODAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cImFuaW1hdGVkXCIgc3R5bGU9XCJ3aWR0aDogODAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cImFuaW1hdGVkXCIgc3R5bGU9XCJ3aWR0aDogODAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cImFuaW1hdGVkXCIgc3R5bGU9XCJ3aWR0aDogODAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, Input, ViewChild } from '@angular/core';
1
+ import { booleanAttribute, ChangeDetectionStrategy, Component, Input, ViewChild } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@ionic/angular";
4
4
  import * as i2 from "../../core/services/platform.service";
@@ -15,12 +15,13 @@ export class AppMarkdownModal {
15
15
  translate;
16
16
  network;
17
17
  cd;
18
- debug;
19
18
  title;
20
19
  showError = true;
21
20
  canPrint = false;
22
21
  data;
23
22
  src;
23
+ enableNavigationHistory = true;
24
+ debug;
24
25
  content;
25
26
  static async show(modalCtrl, options) {
26
27
  const modal = await modalCtrl.create({
@@ -68,25 +69,31 @@ export class AppMarkdownModal {
68
69
  this.content?.resetError();
69
70
  }
70
71
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownModal, deps: [{ token: i0.Injector }, { token: i1.ModalController }, { token: i2.PlatformService }, { token: i3.LocalSettingsService }, { token: i4.TranslateService }, { token: i5.NetworkService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
71
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownModal, selector: "app-markdown-modal", inputs: { debug: "debug", title: "title", showError: "showError", canPrint: "canPrint", data: "data", src: "src" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "@if (title || canPrint) {\n <app-modal-toolbar color=\"light\" [title]=\"title | translate\" (cancel)=\"close($event)\">\n @if (content.canGoBack) {\n <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n @if (canPrint) {\n <ion-button slot=\"end\" class=\"back-button\" (click)=\"content.print($event)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n }\n </app-modal-toolbar>\n}\n\n<ion-content class=\"ion-padding\">\n <app-markdown-content\n #content\n [src]=\"src\"\n [data]=\"data\"\n [showError]=\"showError\"\n [debug]=\"debug\"\n [updateRouteLocation]=\"false\"\n ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i6.ModalToolbarComponent, selector: "app-modal-toolbar", inputs: ["modalName", "title", "color", "showSpinner", "canValidate", "validateIcon"], outputs: ["cancel", "validate"] }, { kind: "component", type: i7.AppMarkdownContent, selector: "app-markdown-content", inputs: ["data", "src", "anchor", "debug", "showError", "animated", "enableNavigationHistory", "updateRouteLocation"], outputs: ["markdownUrlChange"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownModal, selector: "app-markdown-modal", inputs: { title: "title", showError: ["showError", "showError", booleanAttribute], canPrint: ["canPrint", "canPrint", booleanAttribute], data: "data", src: "src", enableNavigationHistory: ["enableNavigationHistory", "enableNavigationHistory", booleanAttribute], debug: ["debug", "debug", booleanAttribute] }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<app-modal-toolbar color=\"light\" [title]=\"title | translate\">\n @if (content.canGoBack) {\n <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n\n <ion-buttons slot=\"end\">\n @if (canPrint) {\n <ion-button slot=\"end\" (click)=\"content.print()\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n }\n\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n</app-modal-toolbar>\n\n<ion-content class=\"ion-padding\">\n <app-markdown-content\n #content\n [src]=\"src\"\n [data]=\"data\"\n [showError]=\"showError\"\n [debug]=\"debug\"\n [enableNavigationHistory]=\"enableNavigationHistory\"\n [updateRouteLocation]=\"false\"\n ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i6.ModalToolbarComponent, selector: "app-modal-toolbar", inputs: ["modalName", "title", "color", "showSpinner", "canValidate", "validateIcon"], outputs: ["cancel", "validate"] }, { kind: "component", type: i7.AppMarkdownContent, selector: "app-markdown-content", inputs: ["data", "src", "anchor", "debug", "showError", "animated", "enableNavigationHistory", "updateRouteLocation"], outputs: ["markdownUrlChange"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72
73
  }
73
74
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownModal, decorators: [{
74
75
  type: Component,
75
- args: [{ selector: 'app-markdown-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (title || canPrint) {\n <app-modal-toolbar color=\"light\" [title]=\"title | translate\" (cancel)=\"close($event)\">\n @if (content.canGoBack) {\n <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n @if (canPrint) {\n <ion-button slot=\"end\" class=\"back-button\" (click)=\"content.print($event)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n }\n </app-modal-toolbar>\n}\n\n<ion-content class=\"ion-padding\">\n <app-markdown-content\n #content\n [src]=\"src\"\n [data]=\"data\"\n [showError]=\"showError\"\n [debug]=\"debug\"\n [updateRouteLocation]=\"false\"\n ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n" }]
76
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.ModalController }, { type: i2.PlatformService }, { type: i3.LocalSettingsService }, { type: i4.TranslateService }, { type: i5.NetworkService }, { type: i0.ChangeDetectorRef }], propDecorators: { debug: [{
77
- type: Input
78
- }], title: [{
76
+ args: [{ selector: 'app-markdown-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-modal-toolbar color=\"light\" [title]=\"title | translate\">\n @if (content.canGoBack) {\n <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n\n <ion-buttons slot=\"end\">\n @if (canPrint) {\n <ion-button slot=\"end\" (click)=\"content.print()\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n }\n\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n</app-modal-toolbar>\n\n<ion-content class=\"ion-padding\">\n <app-markdown-content\n #content\n [src]=\"src\"\n [data]=\"data\"\n [showError]=\"showError\"\n [debug]=\"debug\"\n [enableNavigationHistory]=\"enableNavigationHistory\"\n [updateRouteLocation]=\"false\"\n ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n" }]
77
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.ModalController }, { type: i2.PlatformService }, { type: i3.LocalSettingsService }, { type: i4.TranslateService }, { type: i5.NetworkService }, { type: i0.ChangeDetectorRef }], propDecorators: { title: [{
79
78
  type: Input
80
79
  }], showError: [{
81
- type: Input
80
+ type: Input,
81
+ args: [{ transform: booleanAttribute }]
82
82
  }], canPrint: [{
83
- type: Input
83
+ type: Input,
84
+ args: [{ transform: booleanAttribute }]
84
85
  }], data: [{
85
86
  type: Input
86
87
  }], src: [{
87
88
  type: Input
89
+ }], enableNavigationHistory: [{
90
+ type: Input,
91
+ args: [{ transform: booleanAttribute }]
92
+ }], debug: [{
93
+ type: Input,
94
+ args: [{ transform: booleanAttribute }]
88
95
  }], content: [{
89
96
  type: ViewChild,
90
97
  args: ['content']
91
98
  }] } });
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24ubW9kYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXJrZG93bi9tYXJrZG93bi5tb2RhbC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hcmtkb3duL21hcmtkb3duLm1vZGFsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQVksS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBc0JsSCxNQUFNLE9BQU8sZ0JBQWdCO0lBd0JmO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBN0JILEtBQUssQ0FBVTtJQUNmLEtBQUssQ0FBUztJQUNkLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixJQUFJLENBQVM7SUFDYixHQUFHLENBQVM7SUFFQyxPQUFPLENBQXFCO0lBRWxELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQTBCLEVBQUUsT0FBZ0M7UUFDNUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ25DLFNBQVMsRUFBRSxnQkFBZ0I7WUFDM0IsY0FBYyxFQUFFLE9BQU87WUFDdkIsYUFBYSxFQUFFLElBQUk7WUFDbkIsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYTtTQUM3QyxDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV0QixPQUFPLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsWUFDWSxRQUFrQixFQUNsQixRQUF5QixFQUN6QixRQUF5QixFQUN6QixRQUE4QixFQUM5QixTQUEyQixFQUMzQixPQUF1QixFQUN2QixFQUFxQjtRQU5yQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQXNCO1FBQzlCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBRS9CLHFCQUFxQjtRQUNyQix1Q0FBdUM7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFTO1FBQ2IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBWSxFQUFFLE9BQTJCO1FBQzlDLElBQUksT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVTLGFBQWE7UUFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRVMsUUFBUSxDQUFDLEdBQW1CO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFUyxVQUFVO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDN0IsQ0FBQzt3R0EvRFUsZ0JBQWdCOzRGQUFoQixnQkFBZ0Isa1JDdEI3QixzdENBb0NBOzs0RkRkYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0Usb0JBQW9CLG1CQUViLHVCQUF1QixDQUFDLE1BQU07d1FBR3RDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRWdCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUGxhdGZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwTWFya2Rvd25Db250ZW50IH0gZnJvbSAnLi9tYXJrZG93bi5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcE1hcmtkb3duTW9kYWxPcHRpb25zIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGRhdGE/OiBzdHJpbmc7XG4gIHNyYz86IHN0cmluZztcbiAgc2hvd0Vycm9yPzogYm9vbGVhbjtcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XG4gIGNhblByaW50PzogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW1hcmtkb3duLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcmtkb3duLm1vZGFsLmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwTWFya2Rvd25Nb2RhbCBpbXBsZW1lbnRzIEFwcE1hcmtkb3duTW9kYWxPcHRpb25zIHtcbiAgQElucHV0KCkgZGVidWc6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dFcnJvciA9IHRydWU7XG4gIEBJbnB1dCgpIGNhblByaW50ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRhdGE6IHN0cmluZztcbiAgQElucHV0KCkgc3JjOiBzdHJpbmc7XG5cbiAgQFZpZXdDaGlsZCgnY29udGVudCcpIGNvbnRlbnQ6IEFwcE1hcmtkb3duQ29udGVudDtcblxuICBzdGF0aWMgYXN5bmMgc2hvdyhtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlciwgb3B0aW9uczogQXBwTWFya2Rvd25Nb2RhbE9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IG1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBBcHBNYXJrZG93bk1vZGFsLFxuICAgICAgY29tcG9uZW50UHJvcHM6IG9wdGlvbnMsXG4gICAgICBrZXlib2FyZENsb3NlOiB0cnVlLFxuICAgICAgY3NzQ2xhc3M6IG9wdGlvbnM/LmNzc0NsYXNzIHx8ICdtb2RhbC1sYXJnZScsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBtb2RhbC5wcmVzZW50KCk7XG5cbiAgICByZXR1cm4gbW9kYWwub25XaWxsRGlzbWlzcygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgdmlld0N0cmw6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgLy8gVE9ETzogZm9yIERFViBvbmx5XG4gICAgLy90aGlzLmRlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBjbG9zZShfPzogRXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3Q3RybC5kaXNtaXNzKCk7XG4gIH1cblxuICBnb0JhY2soZXZlbnQ6IEV2ZW50LCBjb250ZW50OiBBcHBNYXJrZG93bkNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudD8uY2FuR29CYWNrKSB7XG4gICAgICBjb250ZW50LmdvQmFjayhldmVudCk7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsb3NlKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0FzTG9hZGVkKCkge1xuICAgIHRoaXMuY29udGVudD8ubWFya0FzTG9hZGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0FzTG9hZGluZygpIHtcbiAgICB0aGlzLmNvbnRlbnQ/Lm1hcmtBc0xvYWRpbmcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRFcnJvcihlcnI6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgdGhpcy5jb250ZW50Py5zZXRFcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0RXJyb3IoKSB7XG4gICAgdGhpcy5jb250ZW50Py5yZXNldEVycm9yKCk7XG4gIH1cbn1cbiIsIkBpZiAodGl0bGUgfHwgY2FuUHJpbnQpIHtcbiAgPGFwcC1tb2RhbC10b29sYmFyIGNvbG9yPVwibGlnaHRcIiBbdGl0bGVdPVwidGl0bGUgfCB0cmFuc2xhdGVcIiAoY2FuY2VsKT1cImNsb3NlKCRldmVudClcIj5cbiAgICBAaWYgKGNvbnRlbnQuY2FuR29CYWNrKSB7XG4gICAgICA8aW9uLWJ1dHRvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImJhY2stYnV0dG9uXCIgKGNsaWNrKT1cImdvQmFjaygkZXZlbnQsIGNvbnRlbnQpXCIgcm91dGVyRGlyZWN0aW9uPVwiYmFja1wiPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJhcnJvdy1iYWNrXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG4gICAgQGlmIChjYW5QcmludCkge1xuICAgICAgPGlvbi1idXR0b24gc2xvdD1cImVuZFwiIGNsYXNzPVwiYmFjay1idXR0b25cIiAoY2xpY2spPVwiY29udGVudC5wcmludCgkZXZlbnQpXCIgcm91dGVyRGlyZWN0aW9uPVwiYmFja1wiPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJwcmludFwiPjwvaW9uLWljb24+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgfVxuICA8L2FwcC1tb2RhbC10b29sYmFyPlxufVxuXG48aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICA8YXBwLW1hcmtkb3duLWNvbnRlbnRcbiAgICAjY29udGVudFxuICAgIFtzcmNdPVwic3JjXCJcbiAgICBbZGF0YV09XCJkYXRhXCJcbiAgICBbc2hvd0Vycm9yXT1cInNob3dFcnJvclwiXG4gICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICBbdXBkYXRlUm91dGVMb2NhdGlvbl09XCJmYWxzZVwiXG4gID48L2FwcC1tYXJrZG93bi1jb250ZW50PlxuPC9pb24tY29udGVudD5cblxuPGlvbi1mb290ZXIgaGlkZGVuLXhzIGhpZGRlbi1zbSBoaWRkZW4tbW9iaWxlPlxuICA8aW9uLXRvb2xiYXI+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPGlvbi1jb2w+PC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cInNvbGlkXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJjbG9zZSgpXCI+e3sgJ0NPTU1PTi5CVE5fQ0xPU0UnIHwgdHJhbnNsYXRlIH19PC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWZvb3Rlcj5cbiJdfQ==
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24ubW9kYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXJrZG93bi9tYXJrZG93bi5tb2RhbC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hcmtkb3duL21hcmtkb3duLm1vZGFsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQVksS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBeUJwSSxNQUFNLE9BQU8sZ0JBQWdCO0lBeUJmO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBOUJILEtBQUssQ0FBUztJQUNpQixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDaEQsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ21CLHVCQUF1QixHQUFHLElBQUksQ0FBQztJQUMvQixLQUFLLENBQVU7SUFFakMsT0FBTyxDQUFxQjtJQUVsRCxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUEwQixFQUFFLE9BQWdDO1FBQzVFLE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUNuQyxTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLGNBQWMsRUFBRSxPQUFPO1lBQ3ZCLGFBQWEsRUFBRSxJQUFJO1lBQ25CLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLGFBQWE7U0FDN0MsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFdEIsT0FBTyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFlBQ1ksUUFBa0IsRUFDbEIsUUFBeUIsRUFDekIsUUFBeUIsRUFDekIsUUFBOEIsRUFDOUIsU0FBMkIsRUFDM0IsT0FBdUIsRUFDdkIsRUFBcUI7UUFOckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUUvQixxQkFBcUI7UUFDckIsdUNBQXVDO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBUztRQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQVksRUFBRSxPQUEyQjtRQUM5QyxJQUFJLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUN2QixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRVMsWUFBWTtRQUNwQixJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFUyxhQUFhO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVTLFFBQVEsQ0FBQyxHQUFtQjtRQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRVMsVUFBVTtRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzdCLENBQUM7d0dBaEVVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLGtHQUVQLGdCQUFnQixzQ0FDaEIsZ0JBQWdCLDZHQUdoQixnQkFBZ0IsNkJBQ2hCLGdCQUFnQixpSUNoQ3RDLG0xQ0EwQ0E7OzRGRGpCYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0Usb0JBQW9CLG1CQUViLHVCQUF1QixDQUFDLE1BQU07d1FBR3RDLEtBQUs7c0JBQWIsS0FBSztnQkFDa0MsU0FBUztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxRQUFRO3NCQUEvQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUM3QixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNrQyx1QkFBdUI7c0JBQTlELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsS0FBSztzQkFBNUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFaEIsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYm9vbGVhbkF0dHJpYnV0ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3BsYXRmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBNYXJrZG93bkNvbnRlbnQgfSBmcm9tICcuL21hcmtkb3duLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwTWFya2Rvd25Nb2RhbE9wdGlvbnMge1xuICB0aXRsZT86IHN0cmluZztcbiAgZGF0YT86IHN0cmluZztcbiAgc3JjPzogc3RyaW5nO1xuICBzaG93RXJyb3I/OiBib29sZWFuO1xuICBjc3NDbGFzcz86IHN0cmluZztcbiAgY2FuUHJpbnQ/OiBib29sZWFuO1xuICBlbmFibGVOYXZpZ2F0aW9uSGlzdG9yeT86IGJvb2xlYW47XG5cbiAgZGVidWc/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbWFya2Rvd24tbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24ubW9kYWwuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBNYXJrZG93bk1vZGFsIGltcGxlbWVudHMgQXBwTWFya2Rvd25Nb2RhbE9wdGlvbnMge1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0Vycm9yID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNhblByaW50ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRhdGE6IHN0cmluZztcbiAgQElucHV0KCkgc3JjOiBzdHJpbmc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBlbmFibGVOYXZpZ2F0aW9uSGlzdG9yeSA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkZWJ1ZzogYm9vbGVhbjtcblxuICBAVmlld0NoaWxkKCdjb250ZW50JykgY29udGVudDogQXBwTWFya2Rvd25Db250ZW50O1xuXG4gIHN0YXRpYyBhc3luYyBzaG93KG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLCBvcHRpb25zOiBBcHBNYXJrZG93bk1vZGFsT3B0aW9ucykge1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgbW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IEFwcE1hcmtkb3duTW9kYWwsXG4gICAgICBjb21wb25lbnRQcm9wczogb3B0aW9ucyxcbiAgICAgIGtleWJvYXJkQ2xvc2U6IHRydWUsXG4gICAgICBjc3NDbGFzczogb3B0aW9ucz8uY3NzQ2xhc3MgfHwgJ21vZGFsLWxhcmdlJyxcbiAgICB9KTtcblxuICAgIGF3YWl0IG1vZGFsLnByZXNlbnQoKTtcblxuICAgIHJldHVybiBtb2RhbC5vbldpbGxEaXNtaXNzKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCB2aWV3Q3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbmV0d29yazogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICAvLyBUT0RPOiBmb3IgREVWIG9ubHlcbiAgICAvL3RoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIGNsb3NlKF8/OiBFdmVudCkge1xuICAgIHJldHVybiB0aGlzLnZpZXdDdHJsLmRpc21pc3MoKTtcbiAgfVxuXG4gIGdvQmFjayhldmVudDogRXZlbnQsIGNvbnRlbnQ6IEFwcE1hcmtkb3duQ29udGVudCkge1xuICAgIGlmIChjb250ZW50Py5jYW5Hb0JhY2spIHtcbiAgICAgIGNvbnRlbnQuZ29CYWNrKGV2ZW50KTtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2UoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNMb2FkZWQoKSB7XG4gICAgdGhpcy5jb250ZW50Py5tYXJrQXNMb2FkZWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNMb2FkaW5nKCkge1xuICAgIHRoaXMuY29udGVudD8ubWFya0FzTG9hZGluZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEVycm9yKGVycjogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICB0aGlzLmNvbnRlbnQ/LnNldEVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRFcnJvcigpIHtcbiAgICB0aGlzLmNvbnRlbnQ/LnJlc2V0RXJyb3IoKTtcbiAgfVxufVxuIiwiPGFwcC1tb2RhbC10b29sYmFyIGNvbG9yPVwibGlnaHRcIiBbdGl0bGVdPVwidGl0bGUgfCB0cmFuc2xhdGVcIj5cbiAgQGlmIChjb250ZW50LmNhbkdvQmFjaykge1xuICAgIDxpb24tYnV0dG9uIHNsb3Q9XCJzdGFydFwiIGNsYXNzPVwiYmFjay1idXR0b25cIiAoY2xpY2spPVwiZ29CYWNrKCRldmVudCwgY29udGVudClcIiByb3V0ZXJEaXJlY3Rpb249XCJiYWNrXCI+XG4gICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJhcnJvdy1iYWNrXCI+PC9pb24taWNvbj5cbiAgICA8L2lvbi1idXR0b24+XG4gIH1cblxuICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgIEBpZiAoY2FuUHJpbnQpIHtcbiAgICAgIDxpb24tYnV0dG9uIHNsb3Q9XCJlbmRcIiAoY2xpY2spPVwiY29udGVudC5wcmludCgpXCI+XG4gICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cInByaW50XCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG5cbiAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2UoKVwiIHZpc2libGUteHMgdmlzaWJsZS1zbSB2aXNpYmxlLW1vYmlsZT5cbiAgICAgIHt7ICdDT01NT04uQlROX0NMT1NFJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvaW9uLWJ1dHRvbj5cbiAgPC9pb24tYnV0dG9ucz5cbjwvYXBwLW1vZGFsLXRvb2xiYXI+XG5cbjxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gIDxhcHAtbWFya2Rvd24tY29udGVudFxuICAgICNjb250ZW50XG4gICAgW3NyY109XCJzcmNcIlxuICAgIFtkYXRhXT1cImRhdGFcIlxuICAgIFtzaG93RXJyb3JdPVwic2hvd0Vycm9yXCJcbiAgICBbZGVidWddPVwiZGVidWdcIlxuICAgIFtlbmFibGVOYXZpZ2F0aW9uSGlzdG9yeV09XCJlbmFibGVOYXZpZ2F0aW9uSGlzdG9yeVwiXG4gICAgW3VwZGF0ZVJvdXRlTG9jYXRpb25dPVwiZmFsc2VcIlxuICA+PC9hcHAtbWFya2Rvd24tY29udGVudD5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyIGhpZGRlbi14cyBoaWRkZW4tc20gaGlkZGVuLW1vYmlsZT5cbiAgPGlvbi10b29sYmFyPlxuICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxpb24tY29sPjwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJzb2xpZFwiIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwiY2xvc2UoKVwiPnt7ICdDT01NT04uQlROX0NMT1NFJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1mb290ZXI+XG4iXX0=