@tilde-nlp/ngx-common 5.0.9 → 5.0.11

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.
@@ -1,2 +1,3 @@
1
- export const QUOTA_SERVICE_CONFIGURATION_TOKEN = 'QUOTA_SERVICE_CONFIGURATION_TOKEN';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtc2VydmljZS1jb25maWd1cmF0aW9uLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3NlcnZpY2VzL3F1b3RhL2luamVjdGlvbi10b2tlbnMvcXVvdGEtc2VydmljZS1jb25maWd1cmF0aW9uLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFFVT1RBX1NFUlZJQ0VfQ09ORklHVVJBVElPTl9UT0tFTiA9ICdRVU9UQV9TRVJWSUNFX0NPTkZJR1VSQVRJT05fVE9LRU4nOyJdfQ==
1
+ import { InjectionToken } from "@angular/core";
2
+ export const QUOTA_SERVICE_CONFIGURATION_TOKEN = new InjectionToken('QUOTA_SERVICE_CONFIGURATION_TOKEN');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtc2VydmljZS1jb25maWd1cmF0aW9uLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3NlcnZpY2VzL3F1b3RhL2luamVjdGlvbi10b2tlbnMvcXVvdGEtc2VydmljZS1jb25maWd1cmF0aW9uLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcsSUFBSSxjQUFjLENBQTRCLG1DQUFtQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFF1b3RhU2VydmljZUNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL3F1b3RhLXNlcnZpY2UtY29uZmlndXJhdGlvbi5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFFVT1RBX1NFUlZJQ0VfQ09ORklHVVJBVElPTl9UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxRdW90YVNlcnZpY2VDb25maWd1cmF0aW9uPignUVVPVEFfU0VSVklDRV9DT05GSUdVUkFUSU9OX1RPS0VOJyk7XHJcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvdGV4dC10by1zcGVlY2gvbW9kZWxzL3ZvaWNlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFZvaWNlIHtcclxuICB2b2ljZTogc3RyaW5nO1xyXG4gIGFwaVZlcnNpb246IG51bWJlcjtcclxufVxyXG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class TTSApiService {
5
+ #http = inject(HttpClient);
6
+ play(text, voice) {
7
+ if (voice.apiVersion === 1) {
8
+ return this.#http.get(`https://services.tilde.com/service/tts?system=${voice.voice}&text=${text}`, { responseType: 'blob' });
9
+ }
10
+ const headers = { 'skip-auth': 'true' };
11
+ return this.#http.post(`https://runa.tilde.lv/client/say/?text=${text}&voice=${voice.voice}`, null, { headers, responseType: 'blob' });
12
+ }
13
+ static { this.ɵfac = function TTSApiService_Factory(t) { return new (t || TTSApiService)(); }; }
14
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: TTSApiService, factory: TTSApiService.ɵfac, providedIn: 'root' }); }
15
+ }
16
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TTSApiService, [{
17
+ type: Injectable,
18
+ args: [{
19
+ providedIn: 'root',
20
+ }]
21
+ }], null, null); })();
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHRzLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3RleHQtdG8tc3BlZWNoL3NlcnZpY2VzL3R0cy1hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBT25ELE1BQU0sT0FBTyxhQUFhO0lBQ2YsS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVwQyxJQUFJLENBQUMsSUFBWSxFQUFFLEtBQVk7UUFDN0IsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ25CLGlEQUFpRCxLQUFLLENBQUMsS0FBSyxTQUFTLElBQUksRUFBRSxFQUMzRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FDekIsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUV0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwQiwwQ0FBMEMsSUFBSSxVQUFVLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFDckUsSUFBSSxFQUNKLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FDbEMsQ0FBQztJQUNKLENBQUM7OEVBbEJVLGFBQWE7dUVBQWIsYUFBYSxXQUFiLGFBQWEsbUJBRlosTUFBTTs7aUZBRVAsYUFBYTtjQUh6QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBWb2ljZSB9IGZyb20gJy4uL21vZGVscy92b2ljZS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVFRTQXBpU2VydmljZSB7XHJcbiAgcmVhZG9ubHkgI2h0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcblxyXG4gIHBsYXkodGV4dDogc3RyaW5nLCB2b2ljZTogVm9pY2UpOiBPYnNlcnZhYmxlPEJsb2I+IHtcclxuICAgIGlmICh2b2ljZS5hcGlWZXJzaW9uID09PSAxKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNodHRwLmdldChcclxuICAgICAgICBgaHR0cHM6Ly9zZXJ2aWNlcy50aWxkZS5jb20vc2VydmljZS90dHM/c3lzdGVtPSR7dm9pY2Uudm9pY2V9JnRleHQ9JHt0ZXh0fWAsXHJcbiAgICAgICAgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGVhZGVycyA9IHsnc2tpcC1hdXRoJzogJ3RydWUnfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy4jaHR0cC5wb3N0KFxyXG4gICAgICBgaHR0cHM6Ly9ydW5hLnRpbGRlLmx2L2NsaWVudC9zYXkvP3RleHQ9JHt0ZXh0fSZ2b2ljZT0ke3ZvaWNlLnZvaWNlfWAsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIHsgaGVhZGVycywgcmVzcG9uc2VUeXBlOiAnYmxvYicgfVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19
@@ -3,14 +3,14 @@ import { Component, inject, Input } from '@angular/core';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { MatButton, MatIconButton } from '@angular/material/button';
5
5
  import { MatIcon } from '@angular/material/icon';
6
- import { TextPlayService } from './services/text-play.service';
6
+ import { TTSApiService } from './services/tts-api.service';
7
7
  import { finalize } from 'rxjs';
8
8
  import { MatProgressSpinner } from '@angular/material/progress-spinner';
9
- import { TTS_I18N } from './translations/tts-i18n';
10
9
  import { MatTooltipModule } from '@angular/material/tooltip';
11
10
  import { MatSelectModule } from '@angular/material/select';
12
11
  import { MatFormFieldModule } from '@angular/material/form-field';
13
12
  import { FlexLayoutModule } from '@ngbracket/ngx-layout';
13
+ import { TranslateModule } from '@ngx-translate/core';
14
14
  import * as i0 from "@angular/core";
15
15
  import * as i1 from "@angular/common";
16
16
  import * as i2 from "@angular/forms";
@@ -19,27 +19,30 @@ import * as i4 from "@angular/material/form-field";
19
19
  import * as i5 from "@angular/material/select";
20
20
  import * as i6 from "@angular/material/core";
21
21
  import * as i7 from "@ngbracket/ngx-layout/extended";
22
- function TextToSpeechComponent_mat_option_5_Template(rf, ctx) { if (rf & 1) {
22
+ import * as i8 from "@ngx-translate/core";
23
+ const _c0 = a0 => ({ nth: a0 });
24
+ function TextToSpeechComponent_mat_option_6_Template(rf, ctx) { if (rf & 1) {
23
25
  i0.ɵɵelementStart(0, "mat-option", 12);
24
26
  i0.ɵɵtext(1);
27
+ i0.ɵɵpipe(2, "translate");
25
28
  i0.ɵɵelementEnd();
26
29
  } if (rf & 2) {
27
30
  const voice_r1 = ctx.$implicit;
28
- const ctx_r1 = i0.ɵɵnextContext();
29
- i0.ɵɵproperty("value", voice_r1);
31
+ const i_r2 = ctx.index;
32
+ i0.ɵɵproperty("value", voice_r1.voice);
30
33
  i0.ɵɵadvance();
31
- i0.ɵɵtextInterpolate1(" ", ctx_r1.translations.voiceList[voice_r1], " ");
34
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(2, 2, "voice", i0.ɵɵpureFunction1(5, _c0, i_r2 + 1)), " ");
32
35
  } }
33
- function TextToSpeechComponent_mat_icon_13_Template(rf, ctx) { if (rf & 1) {
36
+ function TextToSpeechComponent_mat_icon_17_Template(rf, ctx) { if (rf & 1) {
34
37
  i0.ɵɵelementStart(0, "mat-icon");
35
38
  i0.ɵɵtext(1);
36
39
  i0.ɵɵelementEnd();
37
40
  } if (rf & 2) {
38
- const ctx_r1 = i0.ɵɵnextContext();
41
+ const ctx_r2 = i0.ɵɵnextContext();
39
42
  i0.ɵɵadvance();
40
- i0.ɵɵtextInterpolate1(" ", ctx_r1.isPlaying ? "stop" : "volume_up", " ");
43
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.isPlaying ? "stop" : "volume_up", " ");
41
44
  } }
42
- function TextToSpeechComponent_mat_spinner_14_Template(rf, ctx) { if (rf & 1) {
45
+ function TextToSpeechComponent_mat_spinner_18_Template(rf, ctx) { if (rf & 1) {
43
46
  i0.ɵɵelement(0, "mat-spinner", 13);
44
47
  } if (rf & 2) {
45
48
  i0.ɵɵproperty("diameter", 20);
@@ -47,46 +50,40 @@ function TextToSpeechComponent_mat_spinner_14_Template(rf, ctx) { if (rf & 1) {
47
50
  export class TextToSpeechComponent {
48
51
  constructor() {
49
52
  this.maxCharLength = 1000;
50
- this.langAttributeKey = 'lang';
51
- this.defaultLanguage = 'lv';
52
- this.voiceList = ['sandra4', 'lv-LV-general'];
53
- this.selectedVoice = this.voiceList[0];
54
- this.#textPlayService = inject(TextPlayService);
55
- }
56
- get translations() {
57
- if (TTS_I18N[this.language]) {
58
- return TTS_I18N[this.language];
59
- }
60
- return TTS_I18N[this.defaultLanguage];
53
+ this.#TTSApiService = inject(TTSApiService);
61
54
  }
62
55
  get hasOverflow() {
63
56
  const textarea = document.querySelector('textarea');
64
57
  return textarea?.clientHeight < textarea?.scrollHeight ? true : false;
65
58
  }
66
- #textPlayService;
59
+ #TTSApiService;
67
60
  ngOnInit() {
68
- this.watchHtmlLangAttributeChanges();
61
+ if (!this.voices?.length) {
62
+ this.voices = JSON.parse(this.voicesJson).voices;
63
+ }
64
+ this.selected = this.voices[0];
65
+ this.selectedVoice = this.selected.voice;
69
66
  }
70
- playText() {
67
+ togglePlay() {
71
68
  if (this.isPlaying) {
72
69
  this.stop();
73
70
  return;
74
71
  }
75
72
  this.isLoading = true;
76
73
  const text = this.text.length > this.maxCharLength ? this.text.substring(0, this.maxCharLength) : this.text;
77
- if ((this.audio && text === this.previousText) && (this.selectedVoice === this.previousVoice)) {
74
+ if ((this.audio && text === this.previousText) && (this.selected.voice === this.previousVoice)) {
78
75
  this.audio.play();
79
76
  this.isPlaying = true;
80
77
  this.isLoading = false;
81
78
  return;
82
79
  }
83
- this.#textPlayService
84
- .play(text, this.selectedVoice, this.xApiKey)
80
+ this.#TTSApiService
81
+ .play(text, this.selected)
85
82
  .pipe(finalize(() => { this.isLoading = false; }))
86
83
  .subscribe({
87
84
  next: (res) => {
88
85
  this.previousText = text;
89
- this.previousVoice = this.selectedVoice;
86
+ this.previousVoice = this.selected.voice;
90
87
  const audioUrl = URL.createObjectURL(res);
91
88
  this.audio = new Audio(audioUrl);
92
89
  this.audio.play();
@@ -105,75 +102,63 @@ export class TextToSpeechComponent {
105
102
  this.isPlaying = false;
106
103
  }
107
104
  }
108
- watchHtmlLangAttributeChanges() {
109
- const language = this.getHtmlLangAttribute();
110
- if (!this.language && (language !== this.defaultLanguage)) {
111
- this.language = language;
112
- }
113
- const onLangAttributeChange = (mutationsList) => {
114
- for (const mutation of mutationsList) {
115
- if (mutation.type === 'attributes' && mutation.attributeName === this.langAttributeKey) {
116
- const lang = this.getHtmlLangAttribute();
117
- this.language = lang;
118
- }
119
- }
120
- };
121
- const observer = new MutationObserver(onLangAttributeChange);
122
- const htmlElement = document.querySelector('html');
123
- const config = { attributes: true, attributeFilter: [this.langAttributeKey] };
124
- observer.observe(htmlElement, config);
125
- }
126
- getHtmlLangAttribute() {
127
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
- return document.querySelector('html').getAttribute(this.langAttributeKey).split('-')[0];
105
+ changeSelectedVoice(event) {
106
+ this.selected = this.voices.find((item) => item.voice === event.value);
107
+ this.selectedVoice = this.selected.voice;
129
108
  }
130
109
  static { this.ɵfac = function TextToSpeechComponent_Factory(t) { return new (t || TextToSpeechComponent)(); }; }
131
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TextToSpeechComponent, selectors: [["lib-text-to-speech"]], inputs: { xApiKey: "xApiKey", language: "language", maxCharLength: "maxCharLength" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 15, vars: 15, consts: [[1, "text-to-speech-wrapper", 3, "ngClass.lt-md"], ["appearance", "outline", "color", "accent"], [3, "valueChange", "value"], [3, "value", 4, "ngFor", "ngForOf"], [1, "text-to-speech-textarea-wrapper"], [1, "text-to-speech-textarea", 3, "ngModelChange", "ngModel", "placeholder"], [1, "text-to-speech-characters"], [1, "text-to-speech-actions"], [3, "matTooltip"], ["mat-icon-button", "", 3, "click", "matTooltip", "disabled"], [4, "ngIf"], [3, "diameter", 4, "ngIf"], [3, "value"], [3, "diameter"]], template: function TextToSpeechComponent_Template(rf, ctx) { if (rf & 1) {
110
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TextToSpeechComponent, selectors: [["lib-text-to-speech"]], inputs: { maxCharLength: "maxCharLength", voicesJson: "voicesJson", voices: "voices" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 19, vars: 23, consts: [[1, "text-to-speech-wrapper", 3, "ngClass.lt-md"], ["appearance", "outline", "color", "accent"], [3, "selectionChange", "valueChange", "value"], [3, "value", 4, "ngFor", "ngForOf"], [1, "text-to-speech-textarea-wrapper"], [1, "text-to-speech-textarea", 3, "ngModelChange", "ngModel", "placeholder"], [1, "text-to-speech-characters"], [1, "text-to-speech-actions"], [3, "matTooltip"], ["mat-icon-button", "", 3, "click", "matTooltip", "disabled"], [4, "ngIf"], [3, "diameter", 4, "ngIf"], [3, "value"], [3, "diameter"]], template: function TextToSpeechComponent_Template(rf, ctx) { if (rf & 1) {
132
111
  i0.ɵɵelementStart(0, "div", 0)(1, "mat-form-field", 1)(2, "mat-label");
133
112
  i0.ɵɵtext(3);
113
+ i0.ɵɵpipe(4, "translate");
134
114
  i0.ɵɵelementEnd();
135
- i0.ɵɵelementStart(4, "mat-select", 2);
136
- i0.ɵɵtwoWayListener("valueChange", function TextToSpeechComponent_Template_mat_select_valueChange_4_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.selectedVoice, $event) || (ctx.selectedVoice = $event); return $event; });
137
- i0.ɵɵtemplate(5, TextToSpeechComponent_mat_option_5_Template, 2, 2, "mat-option", 3);
115
+ i0.ɵɵelementStart(5, "mat-select", 2);
116
+ i0.ɵɵlistener("selectionChange", function TextToSpeechComponent_Template_mat_select_selectionChange_5_listener($event) { return ctx.changeSelectedVoice($event); });
117
+ i0.ɵɵtwoWayListener("valueChange", function TextToSpeechComponent_Template_mat_select_valueChange_5_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.selectedVoice, $event) || (ctx.selectedVoice = $event); return $event; });
118
+ i0.ɵɵtemplate(6, TextToSpeechComponent_mat_option_6_Template, 3, 7, "mat-option", 3);
138
119
  i0.ɵɵelementEnd()();
139
- i0.ɵɵelementStart(6, "div", 4)(7, "textarea", 5);
140
- i0.ɵɵtwoWayListener("ngModelChange", function TextToSpeechComponent_Template_textarea_ngModelChange_7_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.text, $event) || (ctx.text = $event); return $event; });
120
+ i0.ɵɵelementStart(7, "div", 4)(8, "textarea", 5);
121
+ i0.ɵɵpipe(9, "translate");
122
+ i0.ɵɵtwoWayListener("ngModelChange", function TextToSpeechComponent_Template_textarea_ngModelChange_8_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.text, $event) || (ctx.text = $event); return $event; });
141
123
  i0.ɵɵelementEnd();
142
- i0.ɵɵelementStart(8, "div", 6);
143
- i0.ɵɵtext(9);
124
+ i0.ɵɵelementStart(10, "div", 6);
125
+ i0.ɵɵtext(11);
144
126
  i0.ɵɵelementEnd()();
145
- i0.ɵɵelementStart(10, "div", 7)(11, "div", 8)(12, "button", 9);
146
- i0.ɵɵlistener("click", function TextToSpeechComponent_Template_button_click_12_listener() { return ctx.playText(); });
147
- i0.ɵɵtemplate(13, TextToSpeechComponent_mat_icon_13_Template, 2, 1, "mat-icon", 10)(14, TextToSpeechComponent_mat_spinner_14_Template, 1, 1, "mat-spinner", 11);
127
+ i0.ɵɵelementStart(12, "div", 7)(13, "div", 8);
128
+ i0.ɵɵpipe(14, "translate");
129
+ i0.ɵɵelementStart(15, "button", 9);
130
+ i0.ɵɵpipe(16, "translate");
131
+ i0.ɵɵlistener("click", function TextToSpeechComponent_Template_button_click_15_listener() { return ctx.togglePlay(); });
132
+ i0.ɵɵtemplate(17, TextToSpeechComponent_mat_icon_17_Template, 2, 1, "mat-icon", 10)(18, TextToSpeechComponent_mat_spinner_18_Template, 1, 1, "mat-spinner", 11);
148
133
  i0.ɵɵelementEnd()()()();
149
134
  } if (rf & 2) {
150
135
  let tmp_7_0;
151
136
  i0.ɵɵproperty("ngClass.lt-md", "mobile");
152
137
  i0.ɵɵadvance(3);
153
- i0.ɵɵtextInterpolate(ctx.translations.selectVoice);
154
- i0.ɵɵadvance();
138
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 15, "selectVoice"));
139
+ i0.ɵɵadvance(2);
155
140
  i0.ɵɵtwoWayProperty("value", ctx.selectedVoice);
156
141
  i0.ɵɵadvance();
157
- i0.ɵɵproperty("ngForOf", ctx.voiceList);
142
+ i0.ɵɵproperty("ngForOf", ctx.voices);
158
143
  i0.ɵɵadvance(2);
159
144
  i0.ɵɵtwoWayProperty("ngModel", ctx.text);
160
- i0.ɵɵproperty("placeholder", ctx.translations.placeholder);
161
- i0.ɵɵadvance();
145
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(9, 17, "placeholder"));
146
+ i0.ɵɵadvance(2);
162
147
  i0.ɵɵclassProp("text-overflow", ctx.hasOverflow);
163
148
  i0.ɵɵadvance();
164
149
  i0.ɵɵtextInterpolate2(" ", (tmp_7_0 = ctx.text == null ? null : ctx.text.length) !== null && tmp_7_0 !== undefined ? tmp_7_0 : 0, "/", ctx.maxCharLength, " ");
165
150
  i0.ɵɵadvance(2);
166
- i0.ɵɵproperty("matTooltip", !ctx.text ? ctx.translations.playDisabled : "");
167
- i0.ɵɵadvance();
168
- i0.ɵɵproperty("matTooltip", ctx.isPlaying ? ctx.translations.stop : ctx.translations.play)("disabled", !ctx.text || ctx.isLoading);
169
- i0.ɵɵadvance();
151
+ i0.ɵɵproperty("matTooltip", !ctx.text ? i0.ɵɵpipeBind1(14, 19, "playDisabled") : "");
152
+ i0.ɵɵadvance(2);
153
+ i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(16, 21, ctx.isPlaying ? "stop" : "play"))("disabled", !ctx.text || ctx.isLoading);
154
+ i0.ɵɵadvance(2);
170
155
  i0.ɵɵproperty("ngIf", !ctx.isLoading);
171
156
  i0.ɵɵadvance();
172
157
  i0.ɵɵproperty("ngIf", ctx.isLoading);
173
158
  } }, dependencies: [CommonModule, i1.NgForOf, i1.NgIf, MatIconButton,
174
159
  MatIcon,
175
160
  FormsModule, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, MatProgressSpinner,
176
- MatTooltipModule, i3.MatTooltip, MatFormFieldModule, i4.MatFormField, i4.MatLabel, MatSelectModule, i5.MatSelect, i6.MatOption, FlexLayoutModule, i7.DefaultClassDirective], styles: [".text-to-speech-wrapper[_ngcontent-%COMP%]{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%], .text-to-speech-textarea[_ngcontent-%COMP%]{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%]{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea[_ngcontent-%COMP%]{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions[_ngcontent-%COMP%]{position:absolute;bottom:-25px}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;background-color:var(--accent)}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{background-color:var(--base-70)}.text-to-speech-characters[_ngcontent-%COMP%]{position:absolute;right:10px;bottom:0;margin:5px;font-size:13px;color:var(--base-65)}.text-overflow[_ngcontent-%COMP%]{right:30px}.mobile[_ngcontent-%COMP%] .text-overflow[_ngcontent-%COMP%]{right:15px}"] }); }
161
+ MatTooltipModule, i3.MatTooltip, MatFormFieldModule, i4.MatFormField, i4.MatLabel, MatSelectModule, i5.MatSelect, i6.MatOption, FlexLayoutModule, i7.DefaultClassDirective, TranslateModule, i8.TranslatePipe], styles: [".text-to-speech-wrapper[_ngcontent-%COMP%]{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%], .text-to-speech-textarea[_ngcontent-%COMP%]{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%]{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea[_ngcontent-%COMP%]{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions[_ngcontent-%COMP%]{position:absolute;bottom:-25px}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;background-color:var(--accent)}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{background-color:var(--base-70)}.text-to-speech-characters[_ngcontent-%COMP%]{position:absolute;right:10px;bottom:0;margin:5px;font-size:13px;color:var(--base-65)}.text-overflow[_ngcontent-%COMP%]{right:30px}.mobile[_ngcontent-%COMP%] .text-overflow[_ngcontent-%COMP%]{right:15px}"] }); }
177
162
  }
178
163
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TextToSpeechComponent, [{
179
164
  type: Component,
@@ -187,14 +172,15 @@ export class TextToSpeechComponent {
187
172
  MatTooltipModule,
188
173
  MatFormFieldModule,
189
174
  MatSelectModule,
190
- FlexLayoutModule
191
- ], template: "<div [ngClass.lt-md]=\"'mobile'\" class=\"text-to-speech-wrapper\">\r\n <mat-form-field appearance=\"outline\" color=\"accent\">\r\n <mat-label>{{translations.selectVoice}}</mat-label>\r\n <mat-select [(value)]=\"selectedVoice\">\r\n <mat-option *ngFor=\"let voice of voiceList\" [value]=\"voice\">\r\n {{ translations.voiceList[voice] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div class=\"text-to-speech-textarea-wrapper\">\r\n <textarea [(ngModel)]=\"text\" class=\"text-to-speech-textarea\" [placeholder]=\"translations.placeholder\"></textarea>\r\n <div [class.text-overflow]=\"hasOverflow\" class=\"text-to-speech-characters\">\r\n {{text?.length ?? 0}}/{{maxCharLength}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-to-speech-actions\">\r\n <div [matTooltip]=\"!text ? translations.playDisabled : ''\">\r\n <button [matTooltip]=\"isPlaying ? translations.stop : translations.play\" [disabled]=\"!text || isLoading\" (click)=\"playText()\" mat-icon-button>\r\n <mat-icon *ngIf=\"!isLoading\"> {{ isPlaying ? 'stop' : 'volume_up' }} </mat-icon>\r\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"20\"></mat-spinner>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".text-to-speech-wrapper{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper mat-form-field{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper,.text-to-speech-textarea{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions{position:absolute;bottom:-25px}.text-to-speech-actions button{color:#fff;background-color:var(--accent)}.text-to-speech-actions button:disabled{background-color:var(--base-70)}.text-to-speech-characters{position:absolute;right:10px;bottom:0;margin:5px;font-size:13px;color:var(--base-65)}.text-overflow{right:30px}.mobile .text-overflow{right:15px}\n"] }]
192
- }], null, { xApiKey: [{
175
+ FlexLayoutModule,
176
+ TranslateModule
177
+ ], template: "<div [ngClass.lt-md]=\"'mobile'\" class=\"text-to-speech-wrapper\">\r\n <mat-form-field appearance=\"outline\" color=\"accent\">\r\n <mat-label>{{\"selectVoice\" | translate }}</mat-label>\r\n <mat-select (selectionChange)=\"changeSelectedVoice($event)\" [(value)]=\"selectedVoice\">\r\n <mat-option *ngFor=\"let voice of voices; let i = index\" [value]=\"voice.voice\">\r\n {{ 'voice' | translate: {nth: i + 1} }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div class=\"text-to-speech-textarea-wrapper\">\r\n <textarea [(ngModel)]=\"text\" class=\"text-to-speech-textarea\" [placeholder]=\"'placeholder' | translate\"></textarea>\r\n <div [class.text-overflow]=\"hasOverflow\" class=\"text-to-speech-characters\">\r\n {{text?.length ?? 0}}/{{maxCharLength}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-to-speech-actions\">\r\n <div [matTooltip]=\"!text ? ('playDisabled' | translate) : ''\">\r\n <button [matTooltip]=\"(isPlaying ? 'stop' : 'play') | translate\" [disabled]=\"!text || isLoading\" (click)=\"togglePlay()\" mat-icon-button>\r\n <mat-icon *ngIf=\"!isLoading\"> {{ isPlaying ? 'stop' : 'volume_up' }} </mat-icon>\r\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"20\"></mat-spinner>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".text-to-speech-wrapper{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper mat-form-field{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper,.text-to-speech-textarea{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions{position:absolute;bottom:-25px}.text-to-speech-actions button{color:#fff;background-color:var(--accent)}.text-to-speech-actions button:disabled{background-color:var(--base-70)}.text-to-speech-characters{position:absolute;right:10px;bottom:0;margin:5px;font-size:13px;color:var(--base-65)}.text-overflow{right:30px}.mobile .text-overflow{right:15px}\n"] }]
178
+ }], null, { maxCharLength: [{
193
179
  type: Input
194
- }], language: [{
180
+ }], voicesJson: [{
195
181
  type: Input
196
- }], maxCharLength: [{
182
+ }], voices: [{
197
183
  type: Input
198
184
  }] }); })();
199
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TextToSpeechComponent, { className: "TextToSpeechComponent", filePath: "lib\\text-to-speech\\text-to-speech.component.ts", lineNumber: 33 }); })();
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC10by1zcGVlY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3RleHQtdG8tc3BlZWNoL3RleHQtdG8tc3BlZWNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi90ZXh0LXRvLXNwZWVjaC90ZXh0LXRvLXNwZWVjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7O0lDUm5ELHNDQUE0RDtJQUMxRCxZQUNGO0lBQUEsaUJBQWE7Ozs7SUFGK0IsZ0NBQWU7SUFDekQsY0FDRjtJQURFLHdFQUNGOzs7SUFjRSxnQ0FBNkI7SUFBQyxZQUF3QztJQUFBLGlCQUFXOzs7SUFBbkQsY0FBd0M7SUFBeEMsd0VBQXdDOzs7SUFDdEUsa0NBQTZEOztJQUE5Qiw2QkFBZTs7QURXdEQsTUFBTSxPQUFPLHFCQUFxQjtJQWxCbEM7UUFxQlcsa0JBQWEsR0FBVyxJQUFJLENBQUM7UUFFckIscUJBQWdCLEdBQUcsTUFBTSxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRS9CLGNBQVMsR0FBRyxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUtsRCxrQkFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFrQnpCLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztLQThFckQ7SUEzRkMsSUFBSSxZQUFZO1FBQ2QsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUF3QixDQUFDO1FBQzNFLE9BQU8sUUFBUSxFQUFFLFlBQVksR0FBRyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUN2RSxDQUFDO0lBRVEsZ0JBQWdCLENBQTJCO0lBRXBELFFBQVE7UUFDTixJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFFdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUU1RyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUM5RixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQjthQUNsQixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEQsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDeEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBRXRCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtvQkFDeEIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLENBQUMsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFTyw2QkFBNkI7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDM0IsQ0FBQztRQUVELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxhQUErQixFQUFFLEVBQUU7WUFDaEUsS0FBSyxNQUFNLFFBQVEsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxRQUFRLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUN2RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFnQixDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQzlFLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsOERBQThEO1FBQzlELE9BQVEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUM7c0ZBNUdVLHFCQUFxQjtvRUFBckIscUJBQXFCO1lDOUI5QixBQURGLEFBREYsOEJBQStELHdCQUNULGdCQUN2QztZQUFBLFlBQTRCO1lBQUEsaUJBQVk7WUFDbkQscUNBQXNDO1lBQTFCLDBOQUF5QjtZQUNuQyxvRkFBNEQ7WUFJaEUsQUFERSxpQkFBYSxFQUNFO1lBR2YsQUFERiw4QkFBNkMsa0JBQzJEO1lBQTVGLDBNQUFrQjtZQUEwRSxpQkFBVztZQUNqSCw4QkFBMkU7WUFDekUsWUFDRjtZQUNGLEFBREUsaUJBQU0sRUFDRjtZQUlGLEFBREYsQUFERiwrQkFBb0MsY0FDeUIsaUJBQ3FGO1lBQXJDLG1HQUFTLGNBQVUsSUFBQztZQUUzSCxBQURBLG1GQUE2Qiw0RUFDa0I7WUFJdkQsQUFERSxBQURFLEFBREUsaUJBQVMsRUFDTCxFQUNGLEVBQ0Y7OztZQXpCRCx3Q0FBMEI7WUFFaEIsZUFBNEI7WUFBNUIsa0RBQTRCO1lBQzNCLGNBQXlCO1lBQXpCLCtDQUF5QjtZQUNMLGNBQVk7WUFBWix1Q0FBWTtZQU9sQyxlQUFrQjtZQUFsQix3Q0FBa0I7WUFBaUMsMERBQXdDO1lBQ2hHLGNBQW1DO1lBQW5DLGdEQUFtQztZQUN0QyxjQUNGO1lBREUsOEpBQ0Y7WUFJSyxlQUFxRDtZQUFyRCwyRUFBcUQ7WUFDaEQsY0FBZ0U7WUFBQyxBQUFqRSwwRkFBZ0Usd0NBQWdDO1lBQzNGLGNBQWdCO1lBQWhCLHFDQUFnQjtZQUNiLGNBQWU7WUFBZixvQ0FBZTs0QkRIakMsWUFBWSx1QkFFWixhQUFhO1lBQ2IsT0FBTztZQUNQLFdBQVcsMkRBQ1gsa0JBQWtCO1lBQ2xCLGdCQUFnQixpQkFDaEIsa0JBQWtCLGdDQUNsQixlQUFlLDhCQUNmLGdCQUFnQjs7aUZBS1AscUJBQXFCO2NBbEJqQyxTQUFTOzJCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1A7b0JBQ1AsWUFBWTtvQkFDWixTQUFTO29CQUNULGFBQWE7b0JBQ2IsT0FBTztvQkFDUCxXQUFXO29CQUNYLGtCQUFrQjtvQkFDbEIsZ0JBQWdCO29CQUNoQixrQkFBa0I7b0JBQ2xCLGVBQWU7b0JBQ2YsZ0JBQWdCO2lCQUNqQjtnQkFLUSxPQUFPO2tCQUFmLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csYUFBYTtrQkFBckIsS0FBSzs7a0ZBSEsscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbiwgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgVGV4dFBsYXlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90ZXh0LXBsYXkuc2VydmljZSc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xyXG5pbXBvcnQgeyBUVFNfSTE4TiB9IGZyb20gJy4vdHJhbnNsYXRpb25zL3R0cy1pMThuJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgRmxleExheW91dE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10ZXh0LXRvLXNwZWVjaCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBNYXRJY29uQnV0dG9uLFxyXG4gICAgTWF0SWNvbixcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIEZsZXhMYXlvdXRNb2R1bGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0LXRvLXNwZWVjaC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RleHQtdG8tc3BlZWNoLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRleHRUb1NwZWVjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgeEFwaUtleSE6IHN0cmluZztcclxuICBASW5wdXQoKSBsYW5ndWFnZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBtYXhDaGFyTGVuZ3RoOiBudW1iZXIgPSAxMDAwO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGxhbmdBdHRyaWJ1dGVLZXkgPSAnbGFuZyc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0TGFuZ3VhZ2UgPSAnbHYnO1xyXG5cclxuICByZWFkb25seSB2b2ljZUxpc3QgPSBbJ3NhbmRyYTQnLCAnbHYtTFYtZ2VuZXJhbCddO1xyXG5cclxuICB0ZXh0ITogc3RyaW5nO1xyXG4gIHByZXZpb3VzVGV4dCE6IHN0cmluZztcclxuICBwcmV2aW91c1ZvaWNlITogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVm9pY2UgPSB0aGlzLnZvaWNlTGlzdFswXTtcclxuICBhdWRpbyE6IEhUTUxBdWRpb0VsZW1lbnQ7XHJcbiAgaXNMb2FkaW5nITogYm9vbGVhbjtcclxuICBpc1BsYXlpbmchOiBib29sZWFuO1xyXG5cclxuICBnZXQgdHJhbnNsYXRpb25zKCkge1xyXG4gICAgaWYgKFRUU19JMThOW3RoaXMubGFuZ3VhZ2VdKSB7XHJcbiAgICAgIHJldHVybiBUVFNfSTE4Tlt0aGlzLmxhbmd1YWdlXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gVFRTX0kxOE5bdGhpcy5kZWZhdWx0TGFuZ3VhZ2VdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc092ZXJmbG93KCkge1xyXG4gICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbiAgICByZXR1cm4gdGV4dGFyZWE/LmNsaWVudEhlaWdodCA8IHRleHRhcmVhPy5zY3JvbGxIZWlnaHQgPyB0cnVlIDogZmFsc2VcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5ICN0ZXh0UGxheVNlcnZpY2UgPSBpbmplY3QoVGV4dFBsYXlTZXJ2aWNlKTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLndhdGNoSHRtbExhbmdBdHRyaWJ1dGVDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwbGF5VGV4dCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzUGxheWluZykge1xyXG4gICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0Lmxlbmd0aCA+IHRoaXMubWF4Q2hhckxlbmd0aCA/IHRoaXMudGV4dC5zdWJzdHJpbmcoMCwgdGhpcy5tYXhDaGFyTGVuZ3RoKSA6IHRoaXMudGV4dDtcclxuXHJcbiAgICBpZiAoKHRoaXMuYXVkaW8gJiYgdGV4dCA9PT0gdGhpcy5wcmV2aW91c1RleHQpICYmICh0aGlzLnNlbGVjdGVkVm9pY2UgPT09IHRoaXMucHJldmlvdXNWb2ljZSkpIHtcclxuICAgICAgdGhpcy5hdWRpby5wbGF5KCk7XHJcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuI3RleHRQbGF5U2VydmljZVxyXG4gICAgICAucGxheSh0ZXh0LCB0aGlzLnNlbGVjdGVkVm9pY2UsIHRoaXMueEFwaUtleSlcclxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4geyB0aGlzLmlzTG9hZGluZyA9IGZhbHNlIH0pKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzVGV4dCA9IHRleHQ7XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzVm9pY2UgPSB0aGlzLnNlbGVjdGVkVm9pY2U7XHJcbiAgICAgICAgICBjb25zdCBhdWRpb1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwocmVzKTtcclxuICAgICAgICAgIHRoaXMuYXVkaW8gPSBuZXcgQXVkaW8oYXVkaW9VcmwpO1xyXG4gICAgICAgICAgdGhpcy5hdWRpby5wbGF5KCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIHRoaXMuYXVkaW8ub25lbmRlZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChhdWRpb1VybCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RvcCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmF1ZGlvKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8ucGF1c2UoKTtcclxuICAgICAgdGhpcy5hdWRpby5jdXJyZW50VGltZSA9IDA7XHJcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdhdGNoSHRtbExhbmdBdHRyaWJ1dGVDaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldEh0bWxMYW5nQXR0cmlidXRlKCk7XHJcbiAgICBcclxuICAgIGlmICghdGhpcy5sYW5ndWFnZSAmJiAobGFuZ3VhZ2UgIT09IHRoaXMuZGVmYXVsdExhbmd1YWdlKSkge1xyXG4gICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb25MYW5nQXR0cmlidXRlQ2hhbmdlID0gKG11dGF0aW9uc0xpc3Q6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcclxuICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XHJcbiAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSB0aGlzLmxhbmdBdHRyaWJ1dGVLZXkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmdldEh0bWxMYW5nQXR0cmlidXRlKCk7XHJcbiAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgXHJcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG9uTGFuZ0F0dHJpYnV0ZUNoYW5nZSk7XHJcbiAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbdGhpcy5sYW5nQXR0cmlidXRlS2V5XSB9O1xyXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShodG1sRWxlbWVudCwgY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SHRtbExhbmdBdHRyaWJ1dGUoKTogc3RyaW5nIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICByZXR1cm4gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKSBhcyBhbnkpLmdldEF0dHJpYnV0ZSh0aGlzLmxhbmdBdHRyaWJ1dGVLZXkpLnNwbGl0KCctJylbMF07XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgW25nQ2xhc3MubHQtbWRdPVwiJ21vYmlsZSdcIiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXdyYXBwZXJcIj5cclxuICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjb2xvcj1cImFjY2VudFwiPlxyXG4gICAgPG1hdC1sYWJlbD57e3RyYW5zbGF0aW9ucy5zZWxlY3RWb2ljZX19PC9tYXQtbGFiZWw+XHJcbiAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJzZWxlY3RlZFZvaWNlXCI+XHJcbiAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB2b2ljZSBvZiB2b2ljZUxpc3RcIiBbdmFsdWVdPVwidm9pY2VcIj5cclxuICAgICAgICB7eyB0cmFuc2xhdGlvbnMudm9pY2VMaXN0W3ZvaWNlXSB9fVxyXG4gICAgICA8L21hdC1vcHRpb24+XHJcbiAgICA8L21hdC1zZWxlY3Q+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXRleHRhcmVhLXdyYXBwZXJcIj5cclxuICAgIDx0ZXh0YXJlYSBbKG5nTW9kZWwpXT1cInRleHRcIiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXRleHRhcmVhXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9ucy5wbGFjZWhvbGRlclwiPjwvdGV4dGFyZWE+XHJcbiAgICA8ZGl2IFtjbGFzcy50ZXh0LW92ZXJmbG93XT1cImhhc092ZXJmbG93XCIgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC1jaGFyYWN0ZXJzXCI+XHJcbiAgICAgIHt7dGV4dD8ubGVuZ3RoID8/IDB9fS97e21heENoYXJMZW5ndGh9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC1hY3Rpb25zXCI+XHJcbiAgICA8ZGl2IFttYXRUb29sdGlwXT1cIiF0ZXh0ID8gdHJhbnNsYXRpb25zLnBsYXlEaXNhYmxlZCA6ICcnXCI+XHJcbiAgICAgIDxidXR0b24gW21hdFRvb2x0aXBdPVwiaXNQbGF5aW5nID8gdHJhbnNsYXRpb25zLnN0b3AgOiB0cmFuc2xhdGlvbnMucGxheVwiIFtkaXNhYmxlZF09XCIhdGV4dCB8fCBpc0xvYWRpbmdcIiAoY2xpY2spPVwicGxheVRleHQoKVwiIG1hdC1pY29uLWJ1dHRvbj5cclxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhaXNMb2FkaW5nXCI+IHt7IGlzUGxheWluZyA/ICdzdG9wJyA6ICd2b2x1bWVfdXAnIH19ICA8L21hdC1pY29uPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ1wiIFtkaWFtZXRlcl09XCIyMFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
185
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TextToSpeechComponent, { className: "TextToSpeechComponent", filePath: "lib\\text-to-speech\\text-to-speech.component.ts", lineNumber: 35 }); })();
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC10by1zcGVlY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3RleHQtdG8tc3BlZWNoL3RleHQtdG8tc3BlZWNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi90ZXh0LXRvLXNwZWVjaC90ZXh0LXRvLXNwZWVjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQW1CLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7O0lDUmhELHNDQUE4RTtJQUM1RSxZQUNGOztJQUFBLGlCQUFhOzs7O0lBRjJDLHNDQUFxQjtJQUMzRSxjQUNGO0lBREUsb0dBQ0Y7OztJQWNFLGdDQUE2QjtJQUFDLFlBQXdDO0lBQUEsaUJBQVc7OztJQUFuRCxjQUF3QztJQUF4Qyx3RUFBd0M7OztJQUN0RSxrQ0FBNkQ7O0lBQTlCLDZCQUFlOztBRGF0RCxNQUFNLE9BQU8scUJBQXFCO0lBbkJsQztRQW9CVyxrQkFBYSxHQUFXLElBQUksQ0FBQztRQW1CN0IsbUJBQWMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0E2RGpEO0lBbEVDLElBQUksV0FBVztRQUNiLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUF3QixDQUFDO1FBQzNFLE9BQU8sUUFBUSxFQUFFLFlBQVksR0FBRyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUN2RSxDQUFDO0lBRVEsY0FBYyxDQUF5QjtJQUVoRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRTVHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMvRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWM7YUFDaEIsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRCxTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDekMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBRXRCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtvQkFDeEIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLENBQUMsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFzQjtRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQVUsQ0FBQztRQUNoRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7c0ZBaEZVLHFCQUFxQjtvRUFBckIscUJBQXFCO1lDaEM5QixBQURGLEFBREYsOEJBQStELHdCQUNULGdCQUN2QztZQUFBLFlBQThCOztZQUFBLGlCQUFZO1lBQ3JELHFDQUFzRjtZQUExRSxnSUFBbUIsK0JBQTJCLElBQUM7WUFBQywwTkFBeUI7WUFDbkYsb0ZBQThFO1lBSWxGLEFBREUsaUJBQWEsRUFDRTtZQUdmLEFBREYsOEJBQTZDLGtCQUM0RDs7WUFBN0YsME1BQWtCO1lBQTJFLGlCQUFXO1lBQ2xILCtCQUEyRTtZQUN6RSxhQUNGO1lBQ0YsQUFERSxpQkFBTSxFQUNGO1lBR0osQUFERiwrQkFBb0MsY0FDNEI7O1lBQzVELGtDQUF3STs7WUFBdkMsbUdBQVMsZ0JBQVksSUFBQztZQUVySCxBQURBLG1GQUE2Qiw0RUFDa0I7WUFJdkQsQUFERSxBQURFLEFBREUsaUJBQVMsRUFDTCxFQUNGLEVBQ0Y7OztZQXpCRCx3Q0FBMEI7WUFFaEIsZUFBOEI7WUFBOUIsMERBQThCO1lBQ21CLGVBQXlCO1lBQXpCLCtDQUF5QjtZQUNyRCxjQUFXO1lBQVgsb0NBQVc7WUFPakMsZUFBa0I7WUFBbEIsd0NBQWtCO1lBQWlDLGtFQUF5QztZQUNqRyxlQUFtQztZQUFuQyxnREFBbUM7WUFDdEMsY0FDRjtZQURFLDhKQUNGO1lBSUssZUFBd0Q7WUFBeEQsb0ZBQXdEO1lBQ25ELGVBQXdEO1lBQUMsQUFBekQsb0ZBQXdELHdDQUFnQztZQUNuRixlQUFnQjtZQUFoQixxQ0FBZ0I7WUFDYixjQUFlO1lBQWYsb0NBQWU7NEJERmpDLFlBQVksdUJBRVosYUFBYTtZQUNiLE9BQU87WUFDUCxXQUFXLDJEQUNYLGtCQUFrQjtZQUNsQixnQkFBZ0IsaUJBQ2hCLGtCQUFrQixnQ0FDbEIsZUFBZSw4QkFDZixnQkFBZ0IsNEJBQ2hCLGVBQWU7O2lGQUtOLHFCQUFxQjtjQW5CakMsU0FBUzsyQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQO29CQUNQLFlBQVk7b0JBQ1osU0FBUztvQkFDVCxhQUFhO29CQUNiLE9BQU87b0JBQ1AsV0FBVztvQkFDWCxrQkFBa0I7b0JBQ2xCLGdCQUFnQjtvQkFDaEIsa0JBQWtCO29CQUNsQixlQUFlO29CQUNmLGdCQUFnQjtvQkFDaEIsZUFBZTtpQkFDaEI7Z0JBS1EsYUFBYTtrQkFBckIsS0FBSztZQUNHLFVBQVU7a0JBQWxCLEtBQUs7WUFDRyxNQUFNO2tCQUFkLEtBQUs7O2tGQUhLLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b24sIE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IFRUU0FwaVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3R0cy1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdENoYW5nZSwgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IEZsZXhMYXlvdXRNb2R1bGUgfSBmcm9tICdAbmdicmFja2V0L25neC1sYXlvdXQnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgVm9pY2UgfSBmcm9tICcuL21vZGVscy92b2ljZS5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10ZXh0LXRvLXNwZWVjaCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBNYXRJY29uQnV0dG9uLFxyXG4gICAgTWF0SWNvbixcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIEZsZXhMYXlvdXRNb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0LXRvLXNwZWVjaC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RleHQtdG8tc3BlZWNoLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRleHRUb1NwZWVjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgbWF4Q2hhckxlbmd0aDogbnVtYmVyID0gMTAwMDtcclxuICBASW5wdXQoKSB2b2ljZXNKc29uITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHZvaWNlcyE6IFZvaWNlW107XHJcblxyXG4gIHRleHQhOiBzdHJpbmc7XHJcbiAgcHJldmlvdXNUZXh0ITogc3RyaW5nO1xyXG4gIHByZXZpb3VzVm9pY2UhOiBzdHJpbmc7XHJcbiAgYXVkaW8hOiBIVE1MQXVkaW9FbGVtZW50O1xyXG4gIGlzTG9hZGluZyE6IGJvb2xlYW47XHJcbiAgaXNQbGF5aW5nITogYm9vbGVhbjtcclxuICBcclxuICBzZWxlY3RlZCE6IFZvaWNlO1xyXG4gIHNlbGVjdGVkVm9pY2UhOiBzdHJpbmc7XHJcblxyXG4gIGdldCBoYXNPdmVyZmxvdygpIHtcclxuICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKSBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgcmV0dXJuIHRleHRhcmVhPy5jbGllbnRIZWlnaHQgPCB0ZXh0YXJlYT8uc2Nyb2xsSGVpZ2h0ID8gdHJ1ZSA6IGZhbHNlXHJcbiAgfVxyXG5cclxuICByZWFkb25seSAjVFRTQXBpU2VydmljZSA9IGluamVjdChUVFNBcGlTZXJ2aWNlKTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudm9pY2VzPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy52b2ljZXMgPSBKU09OLnBhcnNlKHRoaXMudm9pY2VzSnNvbikudm9pY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnZvaWNlc1swXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRWb2ljZSA9IHRoaXMuc2VsZWN0ZWQudm9pY2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQbGF5KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XHJcbiAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQubGVuZ3RoID4gdGhpcy5tYXhDaGFyTGVuZ3RoID8gdGhpcy50ZXh0LnN1YnN0cmluZygwLCB0aGlzLm1heENoYXJMZW5ndGgpIDogdGhpcy50ZXh0O1xyXG5cclxuICAgIGlmICgodGhpcy5hdWRpbyAmJiB0ZXh0ID09PSB0aGlzLnByZXZpb3VzVGV4dCkgJiYgKHRoaXMuc2VsZWN0ZWQudm9pY2UgPT09IHRoaXMucHJldmlvdXNWb2ljZSkpIHtcclxuICAgICAgdGhpcy5hdWRpby5wbGF5KCk7XHJcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuI1RUU0FwaVNlcnZpY2VcclxuICAgICAgLnBsYXkodGV4dCwgdGhpcy5zZWxlY3RlZClcclxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4geyB0aGlzLmlzTG9hZGluZyA9IGZhbHNlIH0pKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzVGV4dCA9IHRleHQ7XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzVm9pY2UgPSB0aGlzLnNlbGVjdGVkLnZvaWNlO1xyXG4gICAgICAgICAgY29uc3QgYXVkaW9VcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHJlcyk7XHJcbiAgICAgICAgICB0aGlzLmF1ZGlvID0gbmV3IEF1ZGlvKGF1ZGlvVXJsKTtcclxuICAgICAgICAgIHRoaXMuYXVkaW8ucGxheSgpO1xyXG5cclxuICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICB0aGlzLmF1ZGlvLm9uZW5kZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYXVkaW9VcmwpO1xyXG4gICAgICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0b3AoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hdWRpbykge1xyXG4gICAgICB0aGlzLmF1ZGlvLnBhdXNlKCk7XHJcbiAgICAgIHRoaXMuYXVkaW8uY3VycmVudFRpbWUgPSAwO1xyXG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlU2VsZWN0ZWRWb2ljZShldmVudDogTWF0U2VsZWN0Q2hhbmdlKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy52b2ljZXMuZmluZCgoaXRlbSkgPT4gaXRlbS52b2ljZSA9PT0gZXZlbnQudmFsdWUpIGFzIFZvaWNlOyAgXHJcbiAgICB0aGlzLnNlbGVjdGVkVm9pY2UgPSB0aGlzLnNlbGVjdGVkLnZvaWNlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtuZ0NsYXNzLmx0LW1kXT1cIidtb2JpbGUnXCIgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC13cmFwcGVyXCI+XHJcbiAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY29sb3I9XCJhY2NlbnRcIj5cclxuICAgIDxtYXQtbGFiZWw+e3tcInNlbGVjdFZvaWNlXCIgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cclxuICAgIDxtYXQtc2VsZWN0IChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlU2VsZWN0ZWRWb2ljZSgkZXZlbnQpXCIgWyh2YWx1ZSldPVwic2VsZWN0ZWRWb2ljZVwiPlxyXG4gICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdm9pY2Ugb2Ygdm9pY2VzOyBsZXQgaSA9IGluZGV4XCIgW3ZhbHVlXT1cInZvaWNlLnZvaWNlXCI+XHJcbiAgICAgICAge3sgJ3ZvaWNlJyB8IHRyYW5zbGF0ZToge250aDogaSArIDF9IH19XHJcbiAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgIDwvbWF0LXNlbGVjdD5cclxuICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwidGV4dC10by1zcGVlY2gtdGV4dGFyZWEtd3JhcHBlclwiPlxyXG4gICAgPHRleHRhcmVhIFsobmdNb2RlbCldPVwidGV4dFwiIGNsYXNzPVwidGV4dC10by1zcGVlY2gtdGV4dGFyZWFcIiBbcGxhY2Vob2xkZXJdPVwiJ3BsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVwiPjwvdGV4dGFyZWE+XHJcbiAgICA8ZGl2IFtjbGFzcy50ZXh0LW92ZXJmbG93XT1cImhhc092ZXJmbG93XCIgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC1jaGFyYWN0ZXJzXCI+XHJcbiAgICAgIHt7dGV4dD8ubGVuZ3RoID8/IDB9fS97e21heENoYXJMZW5ndGh9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC1hY3Rpb25zXCI+XHJcbiAgICA8ZGl2IFttYXRUb29sdGlwXT1cIiF0ZXh0ID8gKCdwbGF5RGlzYWJsZWQnIHwgdHJhbnNsYXRlKSA6ICcnXCI+XHJcbiAgICAgIDxidXR0b24gW21hdFRvb2x0aXBdPVwiKGlzUGxheWluZyA/ICdzdG9wJyA6ICdwbGF5JykgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwiIXRleHQgfHwgaXNMb2FkaW5nXCIgKGNsaWNrKT1cInRvZ2dsZVBsYXkoKVwiIG1hdC1pY29uLWJ1dHRvbj5cclxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhaXNMb2FkaW5nXCI+IHt7IGlzUGxheWluZyA/ICdzdG9wJyA6ICd2b2x1bWVfdXAnIH19ICA8L21hdC1pY29uPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ1wiIFtkaWFtZXRlcl09XCIyMFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=