@acorex/core 18.16.0-next.3 → 18.16.0-next.5
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.
- package/esm2022/translation/lib/translation.service.mjs +138 -222
- package/esm2022/translation/lib/translator.directive.mjs +2 -2
- package/esm2022/translation/lib/translator.pipe.mjs +2 -2
- package/fesm2022/acorex-core-translation.mjs +139 -223
- package/fesm2022/acorex-core-translation.mjs.map +1 -1
- package/package.json +1 -1
- package/translation/lib/translation.service.d.ts +23 -15
@@ -1,15 +1,30 @@
|
|
1
1
|
import { AXEventService, AXEventTypes } from '@acorex/core/events';
|
2
2
|
import { Injectable, inject } from '@angular/core';
|
3
3
|
import { get as lodashGet, set as lodashSet } from 'lodash-es';
|
4
|
-
import { BehaviorSubject, catchError, finalize, firstValueFrom, forkJoin,
|
4
|
+
import { BehaviorSubject, catchError, distinctUntilChanged, finalize, firstValueFrom, forkJoin, map, of, shareReplay, startWith, switchMap, tap, } from 'rxjs';
|
5
5
|
import { AX_TRANSLATION_CONFIG } from './translation.config';
|
6
6
|
import { AX_TRANSLATION_LOADER } from './translation.loader';
|
7
7
|
import * as i0 from "@angular/core";
|
8
|
-
let
|
8
|
+
let singletonInstance;
|
9
9
|
export function translateSync(key, options) {
|
10
|
-
return
|
10
|
+
return singletonInstance.translateSync(key, options);
|
11
11
|
}
|
12
12
|
export class AXTranslationService {
|
13
|
+
getDefaultLang() {
|
14
|
+
return this.config.defaultLang;
|
15
|
+
}
|
16
|
+
getActiveLang() {
|
17
|
+
return this.activeLang.getValue();
|
18
|
+
}
|
19
|
+
setActiveLang(lang) {
|
20
|
+
if (lang != this.getActiveLang()) {
|
21
|
+
this.activeLang.next(lang);
|
22
|
+
this.eventService.emitEvent({
|
23
|
+
type: AXEventTypes.AXLanguageChanged,
|
24
|
+
payload: lang,
|
25
|
+
});
|
26
|
+
}
|
27
|
+
}
|
13
28
|
/**
|
14
29
|
* @ignore
|
15
30
|
*/
|
@@ -21,9 +36,9 @@ export class AXTranslationService {
|
|
21
36
|
this.ongoingRequests = new Map();
|
22
37
|
this.activeLang = new BehaviorSubject(this.getDefaultLang());
|
23
38
|
this.langChanges$ = this.activeLang.asObservable();
|
24
|
-
this.
|
25
|
-
|
26
|
-
|
39
|
+
this.expressionCache = new Map();
|
40
|
+
this.isExpression = (value) => value.includes('t(');
|
41
|
+
singletonInstance = this;
|
27
42
|
}
|
28
43
|
loadLanguagesAndScopes(languages, scopes) {
|
29
44
|
const requests = languages.flatMap((lang) => scopes.map((scope) => {
|
@@ -32,19 +47,19 @@ export class AXTranslationService {
|
|
32
47
|
return of(this.translationCache[lang][scope]);
|
33
48
|
}
|
34
49
|
// Use the new method to handle ongoing requests and loading
|
35
|
-
return this.
|
50
|
+
return this.fetchTranslationFiles(lang, scope);
|
36
51
|
}));
|
37
52
|
return forkJoin(requests);
|
38
53
|
}
|
39
|
-
|
54
|
+
fetchTranslationFiles(lang, scope) {
|
40
55
|
const requestKey = `${lang}_${scope}`;
|
41
56
|
// Return existing observable if the request is already in progress
|
42
57
|
if (this.ongoingRequests.has(requestKey)) {
|
43
58
|
return this.ongoingRequests.get(requestKey);
|
44
59
|
}
|
45
60
|
// Load translations if not in cache or ongoing requests
|
46
|
-
const translationObservable = this.loader.getTranslation({ lang, scope }).pipe(tap((translations) => this.
|
47
|
-
|
61
|
+
const translationObservable = this.loader.getTranslation({ lang, scope }).pipe(tap((translations) => this.setTranslationCache(lang, scope, translations)), catchError((error) => {
|
62
|
+
this.handleError(`Error loading translations for lang: ${lang}, scope: ${scope}`, error);
|
48
63
|
return of(null);
|
49
64
|
}), finalize(() => {
|
50
65
|
this.eventService.emitEvent({
|
@@ -56,238 +71,139 @@ export class AXTranslationService {
|
|
56
71
|
this.ongoingRequests.set(requestKey, translationObservable);
|
57
72
|
return translationObservable;
|
58
73
|
}
|
59
|
-
|
74
|
+
//#region Helpers Methods
|
75
|
+
/**
|
76
|
+
* Set translation data into cache
|
77
|
+
*/
|
78
|
+
setTranslationCache(lang, scope, translations) {
|
60
79
|
lodashSet(this.translationCache, `${lang}.${scope}`, translations);
|
61
80
|
}
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
return this.
|
67
|
-
}
|
68
|
-
setActiveLang(lang) {
|
69
|
-
if (lang != this.getActiveLang()) {
|
70
|
-
this.lastActiveLang = this.getActiveLang(); // Update last active language
|
71
|
-
this.activeLang.next(lang);
|
72
|
-
this.eventService.emitEvent({
|
73
|
-
type: AXEventTypes.AXLanguageChanged,
|
74
|
-
payload: lang,
|
75
|
-
});
|
76
|
-
}
|
81
|
+
/**
|
82
|
+
* Get the translation from the cache or fallback to loading
|
83
|
+
*/
|
84
|
+
getTranslationFromCache(lang, scope, key) {
|
85
|
+
return lodashGet(this.translationCache, `${lang}.${scope}.${key}`, key);
|
77
86
|
}
|
78
87
|
isLangAvailable(lang, scope = null) {
|
79
88
|
return !this.translationCache[lang] && (!scope || !this.translationCache[lang][scope]);
|
80
89
|
}
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
//
|
87
|
-
|
88
|
-
// Check if translations are available in the cache
|
89
|
-
if (this.translationCache[language]?.[scope]) {
|
90
|
-
return of(this.getTranslation(key, language, scope, options.params));
|
91
|
-
}
|
92
|
-
// Use the new method to handle ongoing requests and loading
|
93
|
-
return this.getOrLoadTranslations(language, scope).pipe(map(() => {
|
94
|
-
const translation = this.translationCache[language]?.[scope]?.[key] || key;
|
95
|
-
return this.getTranslation(translation, language, scope, options.params);
|
96
|
-
}), switchMap((translatedText) => {
|
97
|
-
if (translatedText === key && language !== this.getDefaultLang()) {
|
98
|
-
// If the translation is not found and the language is not default,
|
99
|
-
// try fetching from the default language
|
100
|
-
return fetchTranslation(this.getDefaultLang());
|
101
|
-
}
|
102
|
-
return of(translatedText);
|
103
|
-
}));
|
104
|
-
};
|
105
|
-
// First, try to fetch the translation for the requested language
|
106
|
-
const translationForRequestedLang = fetchTranslation(lang);
|
107
|
-
// If lastActiveLang is available and different from the requested language, use it as a fallback
|
108
|
-
if (this.lastActiveLang && this.lastActiveLang !== lang) {
|
109
|
-
const translationForLastActiveLang = this.getTranslation(key, this.lastActiveLang, scope, options.params);
|
110
|
-
return translationForRequestedLang.pipe(startWith(translationForLastActiveLang));
|
111
|
-
}
|
112
|
-
return translationForRequestedLang;
|
113
|
-
}
|
114
|
-
getTranslation(key, lang, scope, params) {
|
115
|
-
let translation = (lodashGet(this.translationCache, `${lang}.${scope}.${key}`) || key);
|
90
|
+
translateKey(key, lang, scope, params) {
|
91
|
+
// Trigger async preloading without blocking execution
|
92
|
+
this.loadLanguagesAndScopes([lang], [scope]).subscribe({
|
93
|
+
error: (err) => this.handleError(`Error preloading translations for ${lang}, ${scope}`, err),
|
94
|
+
});
|
95
|
+
// Retrieve the translation from the cache or fallback to the key
|
96
|
+
let translation = this.getTranslationFromCache(lang, scope, key);
|
116
97
|
// Replace params like {{ name }}
|
117
|
-
if (params) {
|
98
|
+
if (params && typeof translation === 'string') {
|
118
99
|
Object.keys(params).forEach((paramKey) => {
|
119
|
-
|
120
|
-
if (typeof translation !== 'string') {
|
121
|
-
console.error(`${key} is not string`, { key, lang, scope, params, translation });
|
122
|
-
}
|
123
|
-
else {
|
124
|
-
translation = translation.replace(new RegExp(`{{\\s*${paramKey}\\s*}}`, 'g'), paramValue);
|
125
|
-
}
|
126
|
-
});
|
127
|
-
}
|
128
|
-
if (typeof translation !== 'string') {
|
129
|
-
console.error(`${key} is not string`, { key, lang, scope, params, translation });
|
130
|
-
}
|
131
|
-
else {
|
132
|
-
// Replace translations like {{ t('key') }}
|
133
|
-
const translationPattern = /{{\s*t\('([^']+)'\)\s*}}/g;
|
134
|
-
translation = translation.replace(translationPattern, (match, innerKey) => {
|
135
|
-
return this.getTranslation(innerKey, lang, scope, params);
|
100
|
+
translation = translation.replace(new RegExp(`{{\\s*${paramKey}\\s*}}`, 'g'), params[paramKey]);
|
136
101
|
});
|
137
102
|
}
|
138
|
-
return translation;
|
103
|
+
return translation || key;
|
139
104
|
}
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
return this.langChanges$.pipe(startWith(this.getActiveLang()), switchMap((lang) => {
|
144
|
-
return this.translateAsyncAXTranslate(key, options);
|
145
|
-
}));
|
105
|
+
decodeExpression(expression) {
|
106
|
+
if (this.expressionCache.has(expression)) {
|
107
|
+
return this.expressionCache.get(expression);
|
146
108
|
}
|
147
|
-
|
148
|
-
|
149
|
-
|
109
|
+
const regex = /t\(["']([^"']+)["']\s*(?:,\s*(\{.*?\}))?\)/g;
|
110
|
+
const matches = [];
|
111
|
+
let match;
|
112
|
+
while ((match = regex.exec(expression)) !== null) {
|
113
|
+
const key = match[1];
|
114
|
+
const rawOptions = match[2];
|
115
|
+
if (!rawOptions) {
|
116
|
+
matches.push({ key, scope: null, lang: null, fullMatch: match[0] });
|
117
|
+
continue;
|
118
|
+
}
|
119
|
+
try {
|
120
|
+
const jsonString = rawOptions
|
121
|
+
.replace(/(['"])?([a-zA-Z0-9_]+)(['"])?\s*:/g, '"$2":') // Ensure keys are quoted
|
122
|
+
.replace(/'/g, '"'); // Replace single quotes with double quotes
|
123
|
+
const options = JSON.parse(jsonString);
|
124
|
+
matches.push({
|
125
|
+
key,
|
126
|
+
scope: options.scope || null,
|
127
|
+
lang: options.lang || null,
|
128
|
+
fullMatch: match[0],
|
129
|
+
});
|
130
|
+
}
|
131
|
+
catch (error) {
|
132
|
+
this.handleError(`Failed to parse options for key "${key}":`, error);
|
133
|
+
matches.push({ key, scope: null, lang: null, fullMatch: match[0] });
|
150
134
|
}
|
151
|
-
return this.langChanges$.pipe(startWith(this.getActiveLang()), switchMap((lang) => {
|
152
|
-
return this.load(key, { ...options, lang: lang });
|
153
|
-
}));
|
154
|
-
}
|
155
|
-
}
|
156
|
-
async translateAsync(key, options) {
|
157
|
-
const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options || {};
|
158
|
-
let translation = lodashGet(this.translationCache, `${lang}.${scope}.${key}`);
|
159
|
-
if (!translation) {
|
160
|
-
// If the translation is not in the cache, load it
|
161
|
-
await firstValueFrom(this.load(key, { lang, scope }).pipe(take(1)));
|
162
|
-
translation = lodashGet(this.translationCache, `${lang}.${scope}.${key}`);
|
163
|
-
}
|
164
|
-
// If still not available, try the last active language or default language
|
165
|
-
if (!translation && this.lastActiveLang) {
|
166
|
-
translation = lodashGet(this.translationCache, `${this.lastActiveLang}.${scope}.${key}`);
|
167
135
|
}
|
168
|
-
|
169
|
-
|
136
|
+
this.expressionCache.set(expression, matches);
|
137
|
+
return matches;
|
138
|
+
}
|
139
|
+
handleError(message, error) {
|
140
|
+
console.error(message, error);
|
141
|
+
this.eventService.emitEvent({
|
142
|
+
type: 'error',
|
143
|
+
payload: { message, error },
|
144
|
+
});
|
145
|
+
}
|
146
|
+
//#endregion
|
147
|
+
//#region Async Translation Methods
|
148
|
+
translateText(text, contextLang, contextScope, params) {
|
149
|
+
if (!this.isExpression(text)) {
|
150
|
+
return of(this.translateKey(text, contextLang, contextScope, params));
|
170
151
|
}
|
171
|
-
|
172
|
-
|
152
|
+
const matches = this.decodeExpression(text);
|
153
|
+
// Extract unique languages and scopes for batch loading
|
154
|
+
const langScopeSet = new Set(matches.map(({ lang, scope }) => `${lang || contextLang}_${scope || contextScope}`));
|
155
|
+
const langs = Array.from(new Set(Array.from(langScopeSet).map((pair) => pair.split('_')[0])));
|
156
|
+
const scopes = Array.from(new Set(Array.from(langScopeSet).map((pair) => pair.split('_')[1])));
|
157
|
+
// Load all required languages and scopes
|
158
|
+
return this.loadLanguagesAndScopes(langs, scopes).pipe(map(() => {
|
159
|
+
// Resolve translations after loading
|
160
|
+
const translations = matches.reduce((acc, { key, scope, lang, fullMatch }) => {
|
161
|
+
const resolvedScope = scope || contextScope;
|
162
|
+
const resolvedLang = lang || contextLang;
|
163
|
+
acc[fullMatch] = this.translateKey(key, resolvedLang, resolvedScope, params);
|
164
|
+
return acc;
|
165
|
+
}, {});
|
166
|
+
// Replace all matches in the text with their resolved translations
|
167
|
+
return matches.reduce((result, { fullMatch }) => result.replace(new RegExp(fullMatch.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), translations[fullMatch]), text);
|
168
|
+
}), catchError((error) => {
|
169
|
+
this.handleError(`Error during translation:`, error);
|
170
|
+
return of(text); // Fallback to the original text
|
171
|
+
}));
|
173
172
|
}
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
let translation = lodashGet(this.translationCache, `${lang}.${scope}.${key}`);
|
178
|
-
//
|
179
|
-
const loadLang = () => lastValueFrom(this.getOrLoadTranslations(lang, scope));
|
180
|
-
// If not available, check lastActiveLang
|
181
|
-
if (!translation && this.lastActiveLang) {
|
182
|
-
loadLang();
|
183
|
-
translation = lodashGet(this.translationCache, `${this.lastActiveLang}.${scope}.${key}`);
|
173
|
+
translate$(text, options) {
|
174
|
+
if (options?.lang) {
|
175
|
+
return this.translateText(text, options.lang, options?.scope ?? this.config.defaultScope, options?.params);
|
184
176
|
}
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
translation = lodashGet(this.translationCache, `${this.getDefaultLang()}.${scope}.${key}`);
|
189
|
-
}
|
190
|
-
// Perform parameter replacement
|
191
|
-
return this.getTranslation((translation || key), lang, scope, options?.params);
|
177
|
+
return this.langChanges$.pipe(startWith(this.getActiveLang()), distinctUntilChanged(), switchMap((lang) => {
|
178
|
+
return this.translateText(text, lang, options?.scope ?? this.config.defaultScope, options?.params);
|
179
|
+
}));
|
192
180
|
}
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
// key: match[3] || undefined,
|
205
|
-
// });
|
206
|
-
// }
|
207
|
-
// return result;
|
208
|
-
// }
|
209
|
-
findAXTranslateOptionsFromKey(inputString) {
|
210
|
-
const regex = /t\(\s*['"]([^'"]+)['"]\s*(?:,\s*\{\s*([^}]*)\s*\})?\s*\)/g;
|
211
|
-
const result = [];
|
212
|
-
let match;
|
213
|
-
// Loop through all matches in the input string
|
214
|
-
while ((match = regex.exec(inputString)) !== null) {
|
215
|
-
const key = match[1]; // Extract the key
|
216
|
-
const options = match[2]; // Extract the options object, if present
|
217
|
-
// Parse options into a key-value object
|
218
|
-
const parsedOptions = {};
|
219
|
-
if (options) {
|
220
|
-
options.split(',').forEach((option) => {
|
221
|
-
const [key, value] = option.split(':').map((s) => s.trim().replace(/^['"]|['"]$/g, ''));
|
222
|
-
parsedOptions[key] = value || undefined;
|
223
|
-
});
|
224
|
-
}
|
225
|
-
result.push({
|
226
|
-
key,
|
227
|
-
lang: parsedOptions['lang'],
|
228
|
-
scope: parsedOptions['scope'],
|
229
|
-
});
|
181
|
+
async translateAsync(text, options) {
|
182
|
+
return firstValueFrom(this.translate$(text, options));
|
183
|
+
}
|
184
|
+
//#endregion
|
185
|
+
//#region Sync Translation Methods
|
186
|
+
translateSync(text, options) {
|
187
|
+
if (this.isExpression(text)) {
|
188
|
+
return this.translateTextSync(text, options?.lang ?? this.getActiveLang(), options?.scope ?? this.config.defaultScope);
|
189
|
+
}
|
190
|
+
else {
|
191
|
+
return this.translateKey(text, options?.lang ?? this.getActiveLang(), options?.scope ?? this.config.defaultScope);
|
230
192
|
}
|
231
|
-
return result;
|
232
193
|
}
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
// for (const parsed of optionsFromKey) {
|
242
|
-
// const parsedLang = parsed.lang || options?.lang || this.getActiveLang();
|
243
|
-
// const parsedScope = parsed.scope || options?.scope || this.config.defaultScope;
|
244
|
-
// const parsedKey = parsed.key;
|
245
|
-
// // Push the translation observable to the array
|
246
|
-
// translationObservables.push(
|
247
|
-
// this.load(parsedKey, {
|
248
|
-
// lang: parsedLang,
|
249
|
-
// scope: parsedScope,
|
250
|
-
// params: options?.params,
|
251
|
-
// }),
|
252
|
-
// );
|
253
|
-
// }
|
254
|
-
// } else {
|
255
|
-
// // This is plain text, so wrap it in an observable
|
256
|
-
// translationObservables.push(of(part));
|
257
|
-
// }
|
258
|
-
// }
|
259
|
-
// // Use forkJoin to wait for all observables to complete
|
260
|
-
// return forkJoin(translationObservables).pipe(
|
261
|
-
// map((translatedParts) => translatedParts.join('')), // Join all translated parts
|
262
|
-
// );
|
263
|
-
// }
|
264
|
-
translateAsyncAXTranslate(key, options) {
|
265
|
-
const regex = /(t\(['"][^'"]+['"](?:,\s*\{[^}]*\})?\))/g; // Match t('key', { ... }) calls
|
266
|
-
const splitParts = key.split(regex); // Split into t() parts and text parts
|
267
|
-
const translationObservables = [];
|
268
|
-
for (const part of splitParts) {
|
269
|
-
const optionsFromKey = this.findAXTranslateOptionsFromKey(part);
|
270
|
-
if (optionsFromKey.length > 0) {
|
271
|
-
// This is a t() part, translate it
|
272
|
-
for (const parsed of optionsFromKey) {
|
273
|
-
const parsedLang = parsed.lang || options?.lang || this.getActiveLang();
|
274
|
-
const parsedScope = parsed.scope || options?.scope || this.config.defaultScope;
|
275
|
-
const parsedKey = parsed.key;
|
276
|
-
// Push the translation observable to the array
|
277
|
-
translationObservables.push(this.load(parsedKey, {
|
278
|
-
lang: parsedLang,
|
279
|
-
scope: parsedScope,
|
280
|
-
params: options?.params,
|
281
|
-
}));
|
282
|
-
}
|
283
|
-
}
|
284
|
-
else {
|
285
|
-
// This is plain text, so wrap it in an observable
|
286
|
-
translationObservables.push(of(part));
|
194
|
+
translateTextSync(text, contextLang, contextScope, params) {
|
195
|
+
const matches = this.decodeExpression(text);
|
196
|
+
const translations = matches.reduce((acc, { key, scope, lang, fullMatch }) => {
|
197
|
+
const resolvedScope = scope || contextScope;
|
198
|
+
const resolvedLang = lang || contextLang;
|
199
|
+
// Cache translation to avoid redundant processing
|
200
|
+
if (!acc[fullMatch]) {
|
201
|
+
acc[fullMatch] = this.translateKey(key, resolvedLang, resolvedScope, params);
|
287
202
|
}
|
288
|
-
|
289
|
-
|
290
|
-
|
203
|
+
return acc;
|
204
|
+
}, {});
|
205
|
+
// Replace all matches in one go
|
206
|
+
return matches.reduce((result, { fullMatch }) => result.replace(fullMatch, translations[fullMatch]), text);
|
291
207
|
}
|
292
208
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXTranslationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
293
209
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXTranslationService, providedIn: 'root' }); }
|
@@ -296,4 +212,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
|
|
296
212
|
type: Injectable,
|
297
213
|
args: [{ providedIn: 'root' }]
|
298
214
|
}], ctorParameters: () => [] });
|
299
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS90cmFuc2xhdGlvbi9zcmMvbGliL3RyYW5zbGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFDTCxlQUFlLEVBRWYsVUFBVSxFQUNWLFFBQVEsRUFDUixjQUFjLEVBQ2QsUUFBUSxFQUNSLGFBQWEsRUFDYixHQUFHLEVBQ0gsRUFBRSxFQUNGLFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFRN0QsSUFBSSxPQUE2QixDQUFDO0FBRWxDLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQTRCO0lBQ3JFLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUdELE1BQU0sT0FBTyxvQkFBb0I7SUFjL0I7O09BRUc7SUFDSDtRQWhCUSxXQUFNLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZDLGlCQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXRDLHFC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Q0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDOzhHQXBXVSxvQkFBb0I7a0hBQXBCLG9CQUFvQixjQURQLE1BQU07OzJGQUNuQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhFdmVudFNlcnZpY2UsIEFYRXZlbnRUeXBlcyB9IGZyb20gJ0BhY29yZXgvY29yZS9ldmVudHMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXQgYXMgbG9kYXNoR2V0LCBzZXQgYXMgbG9kYXNoU2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY2F0Y2hFcnJvcixcbiAgZmluYWxpemUsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBmb3JrSm9pbixcbiAgbGFzdFZhbHVlRnJvbSxcbiAgbWFwLFxuICBvZixcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fQ09ORklHIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5jb25maWcnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fTE9BREVSIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5sb2FkZXInO1xuaW1wb3J0IHtcbiAgQVhUcmFuc2xhdGVIYXNoTWFwLFxuICBBWFRyYW5zbGF0ZUxhbmcsXG4gIEFYVHJhbnNsYXRlT3B0aW9ucyxcbiAgQVhUcmFuc2xhdGVQYXJhbXMsXG59IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5sZXQgc2VydmljZTogQVhUcmFuc2xhdGlvblNlcnZpY2U7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVTeW5jKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlcnZpY2UudHJhbnNsYXRlU3luYyhrZXksIG9wdGlvbnMpO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBsb2FkZXIgPSBpbmplY3QoQVhfVFJBTlNMQVRJT05fTE9BREVSKTtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoQVhfVFJBTlNMQVRJT05fQ09ORklHKTtcblxuICBwcml2YXRlIGV2ZW50U2VydmljZSA9IGluamVjdChBWEV2ZW50U2VydmljZSk7XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGlvbkNhY2hlOiBBWFRyYW5zbGF0ZUhhc2hNYXA8QVhUcmFuc2xhdGVIYXNoTWFwPHN0cmluZz4+ID0ge307XG4gIHByaXZhdGUgb25nb2luZ1JlcXVlc3RzOiBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgYWN0aXZlTGFuZzogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5nZXREZWZhdWx0TGFuZygpKTtcbiAgbGFuZ0NoYW5nZXMkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLmFjdGl2ZUxhbmcuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBsYXN0QWN0aXZlTGFuZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIHNlcnZpY2UgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIGxvYWRMYW5ndWFnZXNBbmRTY29wZXMobGFuZ3VhZ2VzOiBzdHJpbmdbXSwgc2NvcGVzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gbGFuZ3VhZ2VzLmZsYXRNYXAoKGxhbmcpID0+XG4gICAgICBzY29wZXMubWFwKChzY29wZSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0cmFuc2xhdGlvbnMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ10/LltzY29wZV0pIHtcbiAgICAgICAgICByZXR1cm4gb2YodGhpcy50cmFuc2xhdGlvbkNhY2hlW2xhbmddW3Njb3BlXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIG5ldyBtZXRob2QgdG8gaGFuZGxlIG9uZ29pbmcgcmVxdWVzdHMgYW5kIGxvYWRpbmdcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JMb2FkVHJhbnNsYXRpb25zKGxhbmcsIHNjb3BlKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckxvYWRUcmFuc2xhdGlvbnMobGFuZzogc3RyaW5nLCBzY29wZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxBWFRyYW5zbGF0ZUhhc2hNYXA8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBgJHtsYW5nfV8ke3Njb3BlfWA7XG5cbiAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgb2JzZXJ2YWJsZSBpZiB0aGUgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgaWYgKHRoaXMub25nb2luZ1JlcXVlc3RzLmhhcyhyZXF1ZXN0S2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMub25nb2luZ1JlcXVlc3RzLmdldChyZXF1ZXN0S2V5KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHRyYW5zbGF0aW9ucyBpZiBub3QgaW4gY2FjaGUgb3Igb25nb2luZyByZXF1ZXN0c1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uT2JzZXJ2YWJsZSA9IHRoaXMubG9hZGVyLmdldFRyYW5zbGF0aW9uKHsgbGFuZywgc2NvcGUgfSkucGlwZShcbiAgICAgIHRhcCgodHJhbnNsYXRpb25zKSA9PiB0aGlzLmNhY2hlVHJhbnNsYXRpb25zKGxhbmcsIHNjb3BlLCB0cmFuc2xhdGlvbnMpKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgdHJhbnNsYXRpb25zIGZvciBsYW5nOiAke2xhbmd9LCBzY29wZTogJHtzY29wZX1gLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEFYRXZlbnRUeXBlcy5BWExhbmd1YWdlTG9hZGVkLFxuICAgICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uZ29pbmdSZXF1ZXN0cy5kZWxldGUocmVxdWVzdEtleSk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgICB0aGlzLm9uZ29pbmdSZXF1ZXN0cy5zZXQocmVxdWVzdEtleSwgdHJhbnNsYXRpb25PYnNlcnZhYmxlKTtcbiAgICByZXR1cm4gdHJhbnNsYXRpb25PYnNlcnZhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZVRyYW5zbGF0aW9ucyhsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIHRyYW5zbGF0aW9uczogQVhUcmFuc2xhdGVIYXNoTWFwPHN0cmluZz4pOiB2b2lkIHtcbiAgICBsb2Rhc2hTZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHtsYW5nfS4ke3Njb3BlfWAsIHRyYW5zbGF0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmYXVsdExhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGVmYXVsdExhbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlTGFuZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUxhbmcuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVMYW5nKGxhbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChsYW5nICE9IHRoaXMuZ2V0QWN0aXZlTGFuZygpKSB7XG4gICAgICB0aGlzLmxhc3RBY3RpdmVMYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCk7IC8vIFVwZGF0ZSBsYXN0IGFjdGl2ZSBsYW5ndWFnZVxuICAgICAgdGhpcy5hY3RpdmVMYW5nLm5leHQobGFuZyk7XG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICB0eXBlOiBBWEV2ZW50VHlwZXMuQVhMYW5ndWFnZUNoYW5nZWQsXG4gICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNMYW5nQXZhaWxhYmxlKGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZyA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudHJhbnNsYXRpb25DYWNoZVtsYW5nXSAmJiAoIXNjb3BlIHx8ICF0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ11bc2NvcGVdKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYW5nQXZhaWxhYmxlKCk6IEFYVHJhbnNsYXRlTGFuZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXZhaWxhYmxlTGFuZ3M7XG4gIH1cblxuICBwcml2YXRlIGxvYWQoa2V5OiBzdHJpbmcsIG9wdGlvbnM6IEFYVHJhbnNsYXRlT3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSwgc2NvcGUgPSB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBGdW5jdGlvbiB0byBmZXRjaCB0cmFuc2xhdGlvblxuICAgIGNvbnN0IGZldGNoVHJhbnNsYXRpb24gPSAobGFuZ3VhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0cmFuc2xhdGlvbnMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY2FjaGVcbiAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ3VhZ2VdPy5bc2NvcGVdKSB7XG4gICAgICAgIHJldHVybiBvZih0aGlzLmdldFRyYW5zbGF0aW9uKGtleSwgbGFuZ3VhZ2UsIHNjb3BlLCBvcHRpb25zLnBhcmFtcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdGhlIG5ldyBtZXRob2QgdG8gaGFuZGxlIG9uZ29pbmcgcmVxdWVzdHMgYW5kIGxvYWRpbmdcbiAgICAgIHJldHVybiB0aGlzLmdldE9yTG9hZFRyYW5zbGF0aW9ucyhsYW5ndWFnZSwgc2NvcGUpLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ3VhZ2VdPy5bc2NvcGVdPy5ba2V5XSB8fCBrZXk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24odHJhbnNsYXRpb24sIGxhbmd1YWdlLCBzY29wZSwgb3B0aW9ucy5wYXJhbXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCh0cmFuc2xhdGVkVGV4dCkgPT4ge1xuICAgICAgICAgIGlmICh0cmFuc2xhdGVkVGV4dCA9PT0ga2V5ICYmIGxhbmd1YWdlICE9PSB0aGlzLmdldERlZmF1bHRMYW5nKCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0cmFuc2xhdGlvbiBpcyBub3QgZm91bmQgYW5kIHRoZSBsYW5ndWFnZSBpcyBub3QgZGVmYXVsdCxcbiAgICAgICAgICAgIC8vIHRyeSBmZXRjaGluZyBmcm9tIHRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hUcmFuc2xhdGlvbih0aGlzLmdldERlZmF1bHRMYW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2YodHJhbnNsYXRlZFRleHQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEZpcnN0LCB0cnkgdG8gZmV0Y2ggdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlXG4gICAgY29uc3QgdHJhbnNsYXRpb25Gb3JSZXF1ZXN0ZWRMYW5nID0gZmV0Y2hUcmFuc2xhdGlvbihsYW5nKTtcblxuICAgIC8vIElmIGxhc3RBY3RpdmVMYW5nIGlzIGF2YWlsYWJsZSBhbmQgZGlmZmVyZW50IGZyb20gdGhlIHJlcXVlc3RlZCBsYW5ndWFnZSwgdXNlIGl0IGFzIGEgZmFsbGJhY2tcbiAgICBpZiAodGhpcy5sYXN0QWN0aXZlTGFuZyAmJiB0aGlzLmxhc3RBY3RpdmVMYW5nICE9PSBsYW5nKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbkZvckxhc3RBY3RpdmVMYW5nID0gdGhpcy5nZXRUcmFuc2xhdGlvbihcbiAgICAgICAga2V5LFxuICAgICAgICB0aGlzLmxhc3RBY3RpdmVMYW5nLFxuICAgICAgICBzY29wZSxcbiAgICAgICAgb3B0aW9ucy5wYXJhbXMsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uRm9yUmVxdWVzdGVkTGFuZy5waXBlKHN0YXJ0V2l0aCh0cmFuc2xhdGlvbkZvckxhc3RBY3RpdmVMYW5nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uRm9yUmVxdWVzdGVkTGFuZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcsIGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZywgcGFyYW1zPzogQVhUcmFuc2xhdGVQYXJhbXMpOiBzdHJpbmcge1xuICAgIGxldCB0cmFuc2xhdGlvbjogc3RyaW5nID0gKGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApIHx8IGtleSkgYXMgc3RyaW5nO1xuXG4gICAgLy8gUmVwbGFjZSBwYXJhbXMgbGlrZSB7eyBuYW1lIH19XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChwYXJhbUtleSkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbVZhbHVlID0gcGFyYW1zW3BhcmFtS2V5XSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNsYXRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgJHtrZXl9IGlzIG5vdCBzdHJpbmdgLCB7IGtleSwgbGFuZywgc2NvcGUsIHBhcmFtcywgdHJhbnNsYXRpb24gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbi5yZXBsYWNlKG5ldyBSZWdFeHAoYHt7XFxcXHMqJHtwYXJhbUtleX1cXFxccyp9fWAsICdnJyksIHBhcmFtVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRyYW5zbGF0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtrZXl9IGlzIG5vdCBzdHJpbmdgLCB7IGtleSwgbGFuZywgc2NvcGUsIHBhcmFtcywgdHJhbnNsYXRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlcGxhY2UgdHJhbnNsYXRpb25zIGxpa2Uge3sgdCgna2V5JykgfX1cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUGF0dGVybiA9IC97e1xccyp0XFwoJyhbXiddKyknXFwpXFxzKn19L2c7XG4gICAgICB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uLnJlcGxhY2UodHJhbnNsYXRpb25QYXR0ZXJuLCAobWF0Y2gsIGlubmVyS2V5KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0aW9uKGlubmVyS2V5LCBsYW5nLCBzY29wZSwgcGFyYW1zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2xhdGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkoa2V5KTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ0NoYW5nZXMkLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLmdldEFjdGl2ZUxhbmcoKSksXG4gICAgICAgIHN3aXRjaE1hcCgobGFuZykgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZUFzeW5jQVhUcmFuc2xhdGUoa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucz8ubGFuZykge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkKGtleSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5sYW5nQ2hhbmdlcyQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuZ2V0QWN0aXZlTGFuZygpKSxcbiAgICAgICAgc3dpdGNoTWFwKChsYW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubG9hZChrZXksIHsgLi4ub3B0aW9ucywgbGFuZzogbGFuZyB9KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0cmFuc2xhdGVBc3luYyhrZXk6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCksIHNjb3BlID0gdGhpcy5jb25maWcuZGVmYXVsdFNjb3BlIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIGxldCB0cmFuc2xhdGlvbiA9IGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApO1xuXG4gICAgaWYgKCF0cmFuc2xhdGlvbikge1xuICAgICAgLy8gSWYgdGhlIHRyYW5zbGF0aW9uIGlzIG5vdCBpbiB0aGUgY2FjaGUsIGxvYWQgaXRcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMubG9hZChrZXksIHsgbGFuZywgc2NvcGUgfSkucGlwZSh0YWtlKDEpKSk7XG4gICAgICB0cmFuc2xhdGlvbiA9IGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIElmIHN0aWxsIG5vdCBhdmFpbGFibGUsIHRyeSB0aGUgbGFzdCBhY3RpdmUgbGFuZ3VhZ2Ugb3IgZGVmYXVsdCBsYW5ndWFnZVxuICAgIGlmICghdHJhbnNsYXRpb24gJiYgdGhpcy5sYXN0QWN0aXZlTGFuZykge1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmxhc3RBY3RpdmVMYW5nfS4ke3Njb3BlfS4ke2tleX1gKTtcbiAgICB9XG4gICAgaWYgKCF0cmFuc2xhdGlvbikge1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmdldERlZmF1bHRMYW5nKCl9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gcGFyYW1ldGVyIHJlcGxhY2VtZW50XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24oKHRyYW5zbGF0aW9uIHx8IGtleSkgYXMgYW55LCBsYW5nLCBzY29wZSwgb3B0aW9ucz8ucGFyYW1zKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2xhdGVTeW5jKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSwgc2NvcGUgPSB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBhY3RpdmUgbGFuZ3VhZ2UgaXMgYXZhaWxhYmxlXG4gICAgbGV0IHRyYW5zbGF0aW9uID0gbG9kYXNoR2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX0uJHtrZXl9YCk7XG5cbiAgICAvL1xuICAgIGNvbnN0IGxvYWRMYW5nID0gKCkgPT4gbGFzdFZhbHVlRnJvbSh0aGlzLmdldE9yTG9hZFRyYW5zbGF0aW9ucyhsYW5nLCBzY29wZSkpO1xuICAgIC8vIElmIG5vdCBhdmFpbGFibGUsIGNoZWNrIGxhc3RBY3RpdmVMYW5nXG4gICAgaWYgKCF0cmFuc2xhdGlvbiAmJiB0aGlzLmxhc3RBY3RpdmVMYW5nKSB7XG4gICAgICBsb2FkTGFuZygpO1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmxhc3RBY3RpdmVMYW5nfS4ke3Njb3BlfS4ke2tleX1gKTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIGRlZmF1bHQgbGFuZ3VhZ2VcbiAgICBpZiAoIXRyYW5zbGF0aW9uKSB7XG4gICAgICBsb2FkTGFuZygpO1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmdldERlZmF1bHRMYW5nKCl9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gcGFyYW1ldGVyIHJlcGxhY2VtZW50XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24oKHRyYW5zbGF0aW9uIHx8IGtleSkgYXMgYW55LCBsYW5nLCBzY29wZSwgb3B0aW9ucz8ucGFyYW1zKTtcbiAgfVxuICAvLyBwcml2YXRlIGZpbmRBWFRyYW5zbGF0ZU9wdGlvbnNGcm9tS2V5KFxuICAvLyAgIGlucHV0U3RyaW5nOiBzdHJpbmcsXG4gIC8vICk6IChPbWl0PEFYVHJhbnNsYXRlT3B0aW9ucywgJ3BhcmFtcyc+ICYgeyBrZXk6IHN0cmluZyB9KVtdIHtcbiAgLy8gICBjb25zdCByZWdleCA9IC88YXh0KD86XFxzK2xhbmc9XCIoW15cIl0qKVwiKT8oPzpcXHMrc2NvcGU9XCIoW15cIl0qKVwiKT8+KC4qPyk8XFwvYXh0Pi9nO1xuICAvLyAgIGNvbnN0IHJlc3VsdDogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10gPSBbXTtcbiAgLy8gICBsZXQgbWF0Y2g7XG5cbiAgLy8gICAvLyBMb29wIHRocm91Z2ggYWxsIG1hdGNoZXMgaW4gdGhlIGlucHV0IHN0cmluZ1xuICAvLyAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGlucHV0U3RyaW5nKSkgIT09IG51bGwpIHtcbiAgLy8gICAgIHJlc3VsdC5wdXNoKHtcbiAgLy8gICAgICAgbGFuZzogbWF0Y2hbMV0gfHwgdW5kZWZpbmVkLFxuICAvLyAgICAgICBzY29wZTogbWF0Y2hbMl0gfHwgdW5kZWZpbmVkLFxuICAvLyAgICAgICBrZXk6IG1hdGNoWzNdIHx8IHVuZGVmaW5lZCxcbiAgLy8gICAgIH0pO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gcmVzdWx0O1xuICAvLyB9XG4gIHByaXZhdGUgZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkoXG4gICAgaW5wdXRTdHJpbmc6IHN0cmluZyxcbiAgKTogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL3RcXChcXHMqWydcIl0oW14nXCJdKylbJ1wiXVxccyooPzosXFxzKlxce1xccyooW159XSopXFxzKlxcfSk/XFxzKlxcKS9nO1xuICAgIGNvbnN0IHJlc3VsdDogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10gPSBbXTtcbiAgICBsZXQgbWF0Y2g7XG5cbiAgICAvLyBMb29wIHRocm91Z2ggYWxsIG1hdGNoZXMgaW4gdGhlIGlucHV0IHN0cmluZ1xuICAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGlucHV0U3RyaW5nKSkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGtleSA9IG1hdGNoWzFdOyAvLyBFeHRyYWN0IHRoZSBrZXlcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBtYXRjaFsyXTsgLy8gRXh0cmFjdCB0aGUgb3B0aW9ucyBvYmplY3QsIGlmIHByZXNlbnRcblxuICAgICAgLy8gUGFyc2Ugb3B0aW9ucyBpbnRvIGEga2V5LXZhbHVlIG9iamVjdFxuICAgICAgY29uc3QgcGFyc2VkT3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5zcGxpdCgnLCcpLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IG9wdGlvbi5zcGxpdCgnOicpLm1hcCgocykgPT4gcy50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykpO1xuICAgICAgICAgIHBhcnNlZE9wdGlvbnNba2V5XSA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBsYW5nOiBwYXJzZWRPcHRpb25zWydsYW5nJ10sXG4gICAgICAgIHNjb3BlOiBwYXJzZWRPcHRpb25zWydzY29wZSddLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIHByaXZhdGUgdHJhbnNsYXRlQXN5bmNBWFRyYW5zbGF0ZShrZXk6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gIC8vICAgY29uc3QgcmVnZXggPSAvKDxheHQoPzpcXHMrbGFuZz1cIlteXCJdKlwiKT8oPzpcXHMrc2NvcGU9XCJbXlwiXSpcIik/Pi4qPzxcXC9heHQ+KS9nO1xuICAvLyAgIGNvbnN0IHNwbGl0UGFydHMgPSBrZXkuc3BsaXQocmVnZXgpOyAvLyBTcGxpdCBpbnRvIDxheHQ+IHBhcnRzIGFuZCB0ZXh0IHBhcnRzXG5cbiAgLy8gICBjb25zdCB0cmFuc2xhdGlvbk9ic2VydmFibGVzOiBPYnNlcnZhYmxlPHN0cmluZz5bXSA9IFtdO1xuXG4gIC8vICAgZm9yIChjb25zdCBwYXJ0IG9mIHNwbGl0UGFydHMpIHtcbiAgLy8gICAgIGNvbnN0IG9wdGlvbnNGcm9tS2V5ID0gdGhpcy5maW5kQVhUcmFuc2xhdGVPcHRpb25zRnJvbUtleShwYXJ0KTtcblxuICAvLyAgICAgaWYgKG9wdGlvbnNGcm9tS2V5Lmxlbmd0aCA+IDApIHtcbiAgLy8gICAgICAgLy8gVGhpcyBpcyBhbiA8YXh0PiBwYXJ0LCB0cmFuc2xhdGUgaXRcbiAgLy8gICAgICAgZm9yIChjb25zdCBwYXJzZWQgb2Ygb3B0aW9uc0Zyb21LZXkpIHtcbiAgLy8gICAgICAgICBjb25zdCBwYXJzZWRMYW5nID0gcGFyc2VkLmxhbmcgfHwgb3B0aW9ucz8ubGFuZyB8fCB0aGlzLmdldEFjdGl2ZUxhbmcoKTtcbiAgLy8gICAgICAgICBjb25zdCBwYXJzZWRTY29wZSA9IHBhcnNlZC5zY29wZSB8fCBvcHRpb25zPy5zY29wZSB8fCB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGU7XG4gIC8vICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gcGFyc2VkLmtleTtcblxuICAvLyAgICAgICAgIC8vIFB1c2ggdGhlIHRyYW5zbGF0aW9uIG9ic2VydmFibGUgdG8gdGhlIGFycmF5XG4gIC8vICAgICAgICAgdHJhbnNsYXRpb25PYnNlcnZhYmxlcy5wdXNoKFxuICAvLyAgICAgICAgICAgdGhpcy5sb2FkKHBhcnNlZEtleSwge1xuICAvLyAgICAgICAgICAgICBsYW5nOiBwYXJzZWRMYW5nLFxuICAvLyAgICAgICAgICAgICBzY29wZTogcGFyc2VkU2NvcGUsXG4gIC8vICAgICAgICAgICAgIHBhcmFtczogb3B0aW9ucz8ucGFyYW1zLFxuICAvLyAgICAgICAgICAgfSksXG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgLy8gVGhpcyBpcyBwbGFpbiB0ZXh0LCBzbyB3cmFwIGl0IGluIGFuIG9ic2VydmFibGVcbiAgLy8gICAgICAgdHJhbnNsYXRpb25PYnNlcnZhYmxlcy5wdXNoKG9mKHBhcnQpKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICAvLyBVc2UgZm9ya0pvaW4gdG8gd2FpdCBmb3IgYWxsIG9ic2VydmFibGVzIHRvIGNvbXBsZXRlXG4gIC8vICAgcmV0dXJuIGZvcmtKb2luKHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMpLnBpcGUoXG4gIC8vICAgICBtYXAoKHRyYW5zbGF0ZWRQYXJ0cykgPT4gdHJhbnNsYXRlZFBhcnRzLmpvaW4oJycpKSwgLy8gSm9pbiBhbGwgdHJhbnNsYXRlZCBwYXJ0c1xuICAvLyAgICk7XG4gIC8vIH1cbiAgcHJpdmF0ZSB0cmFuc2xhdGVBc3luY0FYVHJhbnNsYXRlKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZWdleCA9IC8odFxcKFsnXCJdW14nXCJdK1snXCJdKD86LFxccypcXHtbXn1dKlxcfSk/XFwpKS9nOyAvLyBNYXRjaCB0KCdrZXknLCB7IC4uLiB9KSBjYWxsc1xuICAgIGNvbnN0IHNwbGl0UGFydHMgPSBrZXkuc3BsaXQocmVnZXgpOyAvLyBTcGxpdCBpbnRvIHQoKSBwYXJ0cyBhbmQgdGV4dCBwYXJ0c1xuXG4gICAgY29uc3QgdHJhbnNsYXRpb25PYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBzcGxpdFBhcnRzKSB7XG4gICAgICBjb25zdCBvcHRpb25zRnJvbUtleSA9IHRoaXMuZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkocGFydCk7XG5cbiAgICAgIGlmIChvcHRpb25zRnJvbUtleS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSB0KCkgcGFydCwgdHJhbnNsYXRlIGl0XG4gICAgICAgIGZvciAoY29uc3QgcGFyc2VkIG9mIG9wdGlvbnNGcm9tS2V5KSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTGFuZyA9IHBhcnNlZC5sYW5nIHx8IG9wdGlvbnM/LmxhbmcgfHwgdGhpcy5nZXRBY3RpdmVMYW5nKCk7XG4gICAgICAgICAgY29uc3QgcGFyc2VkU2NvcGUgPSBwYXJzZWQuc2NvcGUgfHwgb3B0aW9ucz8uc2NvcGUgfHwgdGhpcy5jb25maWcuZGVmYXVsdFNjb3BlO1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEtleSA9IHBhcnNlZC5rZXk7XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSB0cmFuc2xhdGlvbiBvYnNlcnZhYmxlIHRvIHRoZSBhcnJheVxuICAgICAgICAgIHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMucHVzaChcbiAgICAgICAgICAgIHRoaXMubG9hZChwYXJzZWRLZXksIHtcbiAgICAgICAgICAgICAgbGFuZzogcGFyc2VkTGFuZyxcbiAgICAgICAgICAgICAgc2NvcGU6IHBhcnNlZFNjb3BlLFxuICAgICAgICAgICAgICBwYXJhbXM6IG9wdGlvbnM/LnBhcmFtcyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXMgcGxhaW4gdGV4dCwgc28gd3JhcCBpdCBpbiBhbiBvYnNlcnZhYmxlXG4gICAgICAgIHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMucHVzaChvZihwYXJ0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNlIGZvcmtKb2luIHRvIHdhaXQgZm9yIGFsbCBvYnNlcnZhYmxlcyB0byBjb21wbGV0ZVxuICAgIHJldHVybiBmb3JrSm9pbih0cmFuc2xhdGlvbk9ic2VydmFibGVzKS5waXBlKFxuICAgICAgbWFwKCh0cmFuc2xhdGVkUGFydHMpID0+IHRyYW5zbGF0ZWRQYXJ0cy5qb2luKCcnKSksIC8vIEpvaW4gYWxsIHRyYW5zbGF0ZWQgcGFydHNcbiAgICApO1xuICB9XG59XG4iXX0=
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS90cmFuc2xhdGlvbi9zcmMvbGliL3RyYW5zbGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFDTCxlQUFlLEVBRWYsVUFBVSxFQUNWLG9CQUFvQixFQUNwQixRQUFRLEVBQ1IsY0FBYyxFQUNkLFFBQVEsRUFDUixHQUFHLEVBQ0gsRUFBRSxFQUNGLFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUc3RCxJQUFJLGlCQUF1QyxDQUFDO0FBRTVDLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQTRCO0lBQ3JFLE9BQU8saUJBQWlCLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBR0QsTUFBTSxPQUFPLG9CQUFvQjtJQWlCeEIsY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sYUFBYSxDQUFDLElBQVk7UUFDL0Is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QztRQUVGLGdDQUFnQztRQUNoQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQ25CLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUM3RSxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7OEdBalRVLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGNBRFAsTUFBTTs7MkZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWEV2ZW50U2VydmljZSwgQVhFdmVudFR5cGVzIH0gZnJvbSAnQGFjb3JleC9jb3JlL2V2ZW50cyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldCBhcyBsb2Rhc2hHZXQsIHNldCBhcyBsb2Rhc2hTZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjYXRjaEVycm9yLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmluYWxpemUsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBmb3JrSm9pbixcbiAgbWFwLFxuICBvZixcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fQ09ORklHIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5jb25maWcnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fTE9BREVSIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5sb2FkZXInO1xuaW1wb3J0IHsgQVhUcmFuc2xhdGVIYXNoTWFwLCBBWFRyYW5zbGF0ZU9wdGlvbnMsIEFYVHJhbnNsYXRlUGFyYW1zIH0gZnJvbSAnLi90cmFuc2xhdGlvbi50eXBlcyc7XG5cbmxldCBzaW5nbGV0b25JbnN0YW5jZTogQVhUcmFuc2xhdGlvblNlcnZpY2U7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVTeW5jKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNpbmdsZXRvbkluc3RhbmNlLnRyYW5zbGF0ZVN5bmMoa2V5LCBvcHRpb25zKTtcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBWFRyYW5zbGF0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgbG9hZGVyID0gaW5qZWN0KEFYX1RSQU5TTEFUSU9OX0xPQURFUik7XG4gIHByaXZhdGUgY29uZmlnID0gaW5qZWN0KEFYX1RSQU5TTEFUSU9OX0NPTkZJRyk7XG5cbiAgcHJpdmF0ZSBldmVudFNlcnZpY2UgPSBpbmplY3QoQVhFdmVudFNlcnZpY2UpO1xuXG4gIHByaXZhdGUgdHJhbnNsYXRpb25DYWNoZTogQVhUcmFuc2xhdGVIYXNoTWFwPEFYVHJhbnNsYXRlSGFzaE1hcDxzdHJpbmc+PiA9IHt9O1xuICBwcml2YXRlIG9uZ29pbmdSZXF1ZXN0czogTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxhbnk+PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIGFjdGl2ZUxhbmc6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHRoaXMuZ2V0RGVmYXVsdExhbmcoKSk7XG4gIGxhbmdDaGFuZ2VzJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5hY3RpdmVMYW5nLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgZXhwcmVzc2lvbkNhY2hlID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyBrZXk6IHN0cmluZzsgc2NvcGU/OiBzdHJpbmc7IGxhbmc/OiBzdHJpbmc7IGZ1bGxNYXRjaDogc3RyaW5nIH1bXVxuICA+KCk7XG5cbiAgcHVibGljIGdldERlZmF1bHRMYW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRlZmF1bHRMYW5nO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZUxhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVMYW5nLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aXZlTGFuZyhsYW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobGFuZyAhPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSkge1xuICAgICAgdGhpcy5hY3RpdmVMYW5nLm5leHQobGFuZyk7XG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICB0eXBlOiBBWEV2ZW50VHlwZXMuQVhMYW5ndWFnZUNoYW5nZWQsXG4gICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc2luZ2xldG9uSW5zdGFuY2UgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIGxvYWRMYW5ndWFnZXNBbmRTY29wZXMobGFuZ3VhZ2VzOiBzdHJpbmdbXSwgc2NvcGVzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gbGFuZ3VhZ2VzLmZsYXRNYXAoKGxhbmcpID0+XG4gICAgICBzY29wZXMubWFwKChzY29wZSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0cmFuc2xhdGlvbnMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ10/LltzY29wZV0pIHtcbiAgICAgICAgICByZXR1cm4gb2YodGhpcy50cmFuc2xhdGlvbkNhY2hlW2xhbmddW3Njb3BlXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIG5ldyBtZXRob2QgdG8gaGFuZGxlIG9uZ29pbmcgcmVxdWVzdHMgYW5kIGxvYWRpbmdcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hUcmFuc2xhdGlvbkZpbGVzKGxhbmcsIHNjb3BlKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFRyYW5zbGF0aW9uRmlsZXMobGFuZzogc3RyaW5nLCBzY29wZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxBWFRyYW5zbGF0ZUhhc2hNYXA8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBgJHtsYW5nfV8ke3Njb3BlfWA7XG5cbiAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgb2JzZXJ2YWJsZSBpZiB0aGUgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgaWYgKHRoaXMub25nb2luZ1JlcXVlc3RzLmhhcyhyZXF1ZXN0S2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMub25nb2luZ1JlcXVlc3RzLmdldChyZXF1ZXN0S2V5KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHRyYW5zbGF0aW9ucyBpZiBub3QgaW4gY2FjaGUgb3Igb25nb2luZyByZXF1ZXN0c1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uT2JzZXJ2YWJsZSA9IHRoaXMubG9hZGVyLmdldFRyYW5zbGF0aW9uKHsgbGFuZywgc2NvcGUgfSkucGlwZShcbiAgICAgIHRhcCgodHJhbnNsYXRpb25zKSA9PiB0aGlzLnNldFRyYW5zbGF0aW9uQ2FjaGUobGFuZywgc2NvcGUsIHRyYW5zbGF0aW9ucykpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihgRXJyb3IgbG9hZGluZyB0cmFuc2xhdGlvbnMgZm9yIGxhbmc6ICR7bGFuZ30sIHNjb3BlOiAke3Njb3BlfWAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmVtaXRFdmVudCh7XG4gICAgICAgICAgdHlwZTogQVhFdmVudFR5cGVzLkFYTGFuZ3VhZ2VMb2FkZWQsXG4gICAgICAgICAgcGF5bG9hZDogbGFuZyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25nb2luZ1JlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0S2V5KTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgKTtcblxuICAgIHRoaXMub25nb2luZ1JlcXVlc3RzLnNldChyZXF1ZXN0S2V5LCB0cmFuc2xhdGlvbk9ic2VydmFibGUpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbk9ic2VydmFibGU7XG4gIH1cblxuICAvLyNyZWdpb24gIEhlbHBlcnMgTWV0aG9kc1xuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNsYXRpb24gZGF0YSBpbnRvIGNhY2hlXG4gICAqL1xuICBwcml2YXRlIHNldFRyYW5zbGF0aW9uQ2FjaGUobGFuZzogc3RyaW5nLCBzY29wZTogc3RyaW5nLCB0cmFuc2xhdGlvbnM6IEFYVHJhbnNsYXRlSGFzaE1hcDxzdHJpbmc+KTogdm9pZCB7XG4gICAgbG9kYXNoU2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX1gLCB0cmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdHJhbnNsYXRpb24gZnJvbSB0aGUgY2FjaGUgb3IgZmFsbGJhY2sgdG8gbG9hZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvbkZyb21DYWNoZShsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbG9kYXNoR2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX0uJHtrZXl9YCwga2V5KSBhcyBzdHJpbmc7XG4gIH1cblxuICBwdWJsaWMgaXNMYW5nQXZhaWxhYmxlKGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZyA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudHJhbnNsYXRpb25DYWNoZVtsYW5nXSAmJiAoIXNjb3BlIHx8ICF0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ11bc2NvcGVdKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlS2V5KGtleTogc3RyaW5nLCBsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIHBhcmFtcz86IEFYVHJhbnNsYXRlUGFyYW1zKTogc3RyaW5nIHtcbiAgICAvLyBUcmlnZ2VyIGFzeW5jIHByZWxvYWRpbmcgd2l0aG91dCBibG9ja2luZyBleGVjdXRpb25cbiAgICB0aGlzLmxvYWRMYW5ndWFnZXNBbmRTY29wZXMoW2xhbmddLCBbc2NvcGVdKS5zdWJzY3JpYmUoe1xuICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMuaGFuZGxlRXJyb3IoYEVycm9yIHByZWxvYWRpbmcgdHJhbnNsYXRpb25zIGZvciAke2xhbmd9LCAke3Njb3BlfWAsIGVyciksXG4gICAgfSk7XG5cbiAgICAvLyBSZXRyaWV2ZSB0aGUgdHJhbnNsYXRpb24gZnJvbSB0aGUgY2FjaGUgb3IgZmFsbGJhY2sgdG8gdGhlIGtleVxuICAgIGxldCB0cmFuc2xhdGlvbjogc3RyaW5nID0gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21DYWNoZShsYW5nLCBzY29wZSwga2V5KTtcblxuICAgIC8vIFJlcGxhY2UgcGFyYW1zIGxpa2Uge3sgbmFtZSB9fVxuICAgIGlmIChwYXJhbXMgJiYgdHlwZW9mIHRyYW5zbGF0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChwYXJhbUtleSkgPT4ge1xuICAgICAgICB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uLnJlcGxhY2UoXG4gICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccyoke3BhcmFtS2V5fVxcXFxzKn19YCwgJ2cnKSxcbiAgICAgICAgICBwYXJhbXNbcGFyYW1LZXldIGFzIHN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2xhdGlvbiB8fCBrZXk7XG4gIH1cblxuICBwcml2YXRlIGlzRXhwcmVzc2lvbiA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5pbmNsdWRlcygndCgnKTtcblxuICBwcml2YXRlIGRlY29kZUV4cHJlc3Npb24oXG4gICAgZXhwcmVzc2lvbjogc3RyaW5nLFxuICApOiB7IGtleTogc3RyaW5nOyBzY29wZT86IHN0cmluZzsgbGFuZz86IHN0cmluZzsgZnVsbE1hdGNoOiBzdHJpbmcgfVtdIHtcbiAgICBpZiAodGhpcy5leHByZXNzaW9uQ2FjaGUuaGFzKGV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uQ2FjaGUuZ2V0KGV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2V4ID0gL3RcXChbXCInXShbXlwiJ10rKVtcIiddXFxzKig/OixcXHMqKFxcey4qP1xcfSkpP1xcKS9nO1xuICAgIGNvbnN0IG1hdGNoZXM6IHsga2V5OiBzdHJpbmc7IHNjb3BlPzogc3RyaW5nOyBsYW5nPzogc3RyaW5nOyBmdWxsTWF0Y2g6IHN0cmluZyB9W10gPSBbXTtcbiAgICBsZXQgbWF0Y2g7XG5cbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhleHByZXNzaW9uKSkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGtleSA9IG1hdGNoWzFdO1xuICAgICAgY29uc3QgcmF3T3B0aW9ucyA9IG1hdGNoWzJdO1xuXG4gICAgICBpZiAoIXJhd09wdGlvbnMpIHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKHsga2V5LCBzY29wZTogbnVsbCwgbGFuZzogbnVsbCwgZnVsbE1hdGNoOiBtYXRjaFswXSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSByYXdPcHRpb25zXG4gICAgICAgICAgLnJlcGxhY2UoLyhbJ1wiXSk/KFthLXpBLVowLTlfXSspKFsnXCJdKT9cXHMqOi9nLCAnXCIkMlwiOicpIC8vIEVuc3VyZSBrZXlzIGFyZSBxdW90ZWRcbiAgICAgICAgICAucmVwbGFjZSgvJy9nLCAnXCInKTsgLy8gUmVwbGFjZSBzaW5nbGUgcXVvdGVzIHdpdGggZG91YmxlIHF1b3Rlc1xuICAgICAgICBjb25zdCBvcHRpb25zID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcblxuICAgICAgICBtYXRjaGVzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBzY29wZTogb3B0aW9ucy5zY29wZSB8fCBudWxsLFxuICAgICAgICAgIGxhbmc6IG9wdGlvbnMubGFuZyB8fCBudWxsLFxuICAgICAgICAgIGZ1bGxNYXRjaDogbWF0Y2hbMF0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihgRmFpbGVkIHRvIHBhcnNlIG9wdGlvbnMgZm9yIGtleSBcIiR7a2V5fVwiOmAsIGVycm9yKTtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKHsga2V5LCBzY29wZTogbnVsbCwgbGFuZzogbnVsbCwgZnVsbE1hdGNoOiBtYXRjaFswXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmV4cHJlc3Npb25DYWNoZS5zZXQoZXhwcmVzc2lvbiwgbWF0Y2hlcyk7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgZXJyb3IpO1xuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmVtaXRFdmVudCh7XG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgcGF5bG9hZDogeyBtZXNzYWdlLCBlcnJvciB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEFzeW5jIFRyYW5zbGF0aW9uIE1ldGhvZHNcblxuICBwcml2YXRlIHRyYW5zbGF0ZVRleHQoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGNvbnRleHRMYW5nOiBzdHJpbmcsXG4gICAgY29udGV4dFNjb3BlOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogQVhUcmFuc2xhdGVQYXJhbXMsXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLmlzRXhwcmVzc2lvbih0ZXh0KSkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMudHJhbnNsYXRlS2V5KHRleHQsIGNvbnRleHRMYW5nLCBjb250ZXh0U2NvcGUsIHBhcmFtcykpO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5kZWNvZGVFeHByZXNzaW9uKHRleHQpO1xuXG4gICAgLy8gRXh0cmFjdCB1bmlxdWUgbGFuZ3VhZ2VzIGFuZCBzY29wZXMgZm9yIGJhdGNoIGxvYWRpbmdcbiAgICBjb25zdCBsYW5nU2NvcGVTZXQgPSBuZXcgU2V0KFxuICAgICAgbWF0Y2hlcy5tYXAoKHsgbGFuZywgc2NvcGUgfSkgPT4gYCR7bGFuZyB8fCBjb250ZXh0TGFuZ31fJHtzY29wZSB8fCBjb250ZXh0U2NvcGV9YCksXG4gICAgKTtcblxuICAgIGNvbnN0IGxhbmdzID0gQXJyYXkuZnJvbShuZXcgU2V0KEFycmF5LmZyb20obGFuZ1Njb3BlU2V0KS5tYXAoKHBhaXIpID0+IHBhaXIuc3BsaXQoJ18nKVswXSkpKTtcbiAgICBjb25zdCBzY29wZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoQXJyYXkuZnJvbShsYW5nU2NvcGVTZXQpLm1hcCgocGFpcikgPT4gcGFpci5zcGxpdCgnXycpWzFdKSkpO1xuXG4gICAgLy8gTG9hZCBhbGwgcmVxdWlyZWQgbGFuZ3VhZ2VzIGFuZCBzY29wZXNcbiAgICByZXR1cm4gdGhpcy5sb2FkTGFuZ3VhZ2VzQW5kU2NvcGVzKGxhbmdzLCBzY29wZXMpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAvLyBSZXNvbHZlIHRyYW5zbGF0aW9ucyBhZnRlciBsb2FkaW5nXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG1hdGNoZXMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIHsga2V5LCBzY29wZSwgbGFuZywgZnVsbE1hdGNoIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2NvcGUgPSBzY29wZSB8fCBjb250ZXh0U2NvcGU7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZExhbmcgPSBsYW5nIHx8IGNvbnRleHRMYW5nO1xuXG4gICAgICAgICAgICBhY2NbZnVsbE1hdGNoXSA9IHRoaXMudHJhbnNsYXRlS2V5KGtleSwgcmVzb2x2ZWRMYW5nLCByZXNvbHZlZFNjb3BlLCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBhbGwgbWF0Y2hlcyBpbiB0aGUgdGV4dCB3aXRoIHRoZWlyIHJlc29sdmVkIHRyYW5zbGF0aW9uc1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoXG4gICAgICAgICAgKHJlc3VsdCwgeyBmdWxsTWF0Y2ggfSkgPT5cbiAgICAgICAgICAgIHJlc3VsdC5yZXBsYWNlKFxuICAgICAgICAgICAgICBuZXcgUmVnRXhwKGZ1bGxNYXRjaC5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyksICdnJyksXG4gICAgICAgICAgICAgIHRyYW5zbGF0aW9uc1tmdWxsTWF0Y2hdLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGBFcnJvciBkdXJpbmcgdHJhbnNsYXRpb246YCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gb2YodGV4dCk7IC8vIEZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCB0ZXh0XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRyYW5zbGF0ZSQodGV4dDogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAob3B0aW9ucz8ubGFuZykge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dChcbiAgICAgICAgdGV4dCxcbiAgICAgICAgb3B0aW9ucy5sYW5nLFxuICAgICAgICBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUsXG4gICAgICAgIG9wdGlvbnM/LnBhcmFtcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxhbmdDaGFuZ2VzJC5waXBlKFxuICAgICAgc3RhcnRXaXRoKHRoaXMuZ2V0QWN0aXZlTGFuZygpKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAoKGxhbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dCh0ZXh0LCBsYW5nLCBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUsIG9wdGlvbnM/LnBhcmFtcyk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRyYW5zbGF0ZUFzeW5jKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMudHJhbnNsYXRlJCh0ZXh0LCBvcHRpb25zKSk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU3luYyBUcmFuc2xhdGlvbiBNZXRob2RzXG5cbiAgcHVibGljIHRyYW5zbGF0ZVN5bmModGV4dDogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHRleHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U3luYyhcbiAgICAgICAgdGV4dCxcbiAgICAgICAgb3B0aW9ucz8ubGFuZyA/PyB0aGlzLmdldEFjdGl2ZUxhbmcoKSxcbiAgICAgICAgb3B0aW9ucz8uc2NvcGUgPz8gdGhpcy5jb25maWcuZGVmYXVsdFNjb3BlLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlS2V5KFxuICAgICAgICB0ZXh0LFxuICAgICAgICBvcHRpb25zPy5sYW5nID8/IHRoaXMuZ2V0QWN0aXZlTGFuZygpLFxuICAgICAgICBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlVGV4dFN5bmMoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGNvbnRleHRMYW5nOiBzdHJpbmcsXG4gICAgY29udGV4dFNjb3BlOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogQVhUcmFuc2xhdGVQYXJhbXMsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZGVjb2RlRXhwcmVzc2lvbih0ZXh0KTtcblxuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG1hdGNoZXMucmVkdWNlKFxuICAgICAgKGFjYywgeyBrZXksIHNjb3BlLCBsYW5nLCBmdWxsTWF0Y2ggfSkgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZFNjb3BlID0gc2NvcGUgfHwgY29udGV4dFNjb3BlO1xuICAgICAgICBjb25zdCByZXNvbHZlZExhbmcgPSBsYW5nIHx8IGNvbnRleHRMYW5nO1xuXG4gICAgICAgIC8vIENhY2hlIHRyYW5zbGF0aW9uIHRvIGF2b2lkIHJlZHVuZGFudCBwcm9jZXNzaW5nXG4gICAgICAgIGlmICghYWNjW2Z1bGxNYXRjaF0pIHtcbiAgICAgICAgICBhY2NbZnVsbE1hdGNoXSA9IHRoaXMudHJhbnNsYXRlS2V5KGtleSwgcmVzb2x2ZWRMYW5nLCByZXNvbHZlZFNjb3BlLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICApO1xuXG4gICAgLy8gUmVwbGFjZSBhbGwgbWF0Y2hlcyBpbiBvbmUgZ29cbiAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB7IGZ1bGxNYXRjaCB9KSA9PiByZXN1bHQucmVwbGFjZShmdWxsTWF0Y2gsIHRyYW5zbGF0aW9uc1tmdWxsTWF0Y2hdKSxcbiAgICAgIHRleHQsXG4gICAgKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxufVxuIl19
|
@@ -12,7 +12,7 @@ export class AXTranslatorDirective {
|
|
12
12
|
this.viewContainer.clear();
|
13
13
|
this.viewContainer.createEmbeddedView(this.templateRef, {
|
14
14
|
$implicit: (key, options) => {
|
15
|
-
return this.translationService.translate(key, options);
|
15
|
+
return this.translationService.translate$(key, options);
|
16
16
|
},
|
17
17
|
});
|
18
18
|
}
|
@@ -25,4 +25,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
|
|
25
25
|
selector: '[translate]',
|
26
26
|
}]
|
27
27
|
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1.AXTranslationService }] });
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvdHJhbnNsYXRpb24vc3JjL2xpYi90cmFuc2xhdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBTTdELE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsWUFDVSxXQUE2QixFQUM3QixhQUErQixFQUMvQixrQkFBd0M7UUFGeEMsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO0lBQy9DLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDdEQsU0FBUyxFQUFFLENBQUMsR0FBVyxFQUFFLE9BQTRCLEVBQUUsRUFBRTtnQkFDdkQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxRCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FkVSxxQkFBcUI7a0dBQXJCLHFCQUFxQjs7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtpQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRlT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdHJhbnNsYXRlXScsXG59KVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRvckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBBWFRyYW5zbGF0aW9uU2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZiwge1xuICAgICAgJGltcGxpY2l0OiAoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSQoa2V5LCBvcHRpb25zKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
@@ -11,7 +11,7 @@ export class AXTranslatorPipe {
|
|
11
11
|
if (!key) {
|
12
12
|
return of(''); // Return an empty observable if the key is not provided
|
13
13
|
}
|
14
|
-
return this.service.translate(key, options);
|
14
|
+
return this.service.translate$(key, options);
|
15
15
|
}
|
16
16
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXTranslatorPipe, deps: [{ token: i1.AXTranslationService }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
17
17
|
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.0", ngImport: i0, type: AXTranslatorPipe, name: "translate" }); }
|
@@ -20,4 +20,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
|
|
20
20
|
type: Pipe,
|
21
21
|
args: [{ name: 'translate', pure: true }]
|
22
22
|
}], ctorParameters: () => [{ type: i1.AXTranslationService }] });
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvci5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3RyYW5zbGF0aW9uL3NyYy9saWIvdHJhbnNsYXRvci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQUk3RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQW9CLE9BQTZCO1FBQTdCLFlBQU8sR0FBUCxPQUFPLENBQXNCO0lBQUcsQ0FBQztJQUVyRCxTQUFTLENBQUMsR0FBVyxFQUFFLE9BQTRCO1FBQ2pELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsd0RBQXdEO1FBQ3pFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDOzhHQVJVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFYVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRlT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5AUGlwZSh7IG5hbWU6ICd0cmFuc2xhdGUnLCBwdXJlOiB0cnVlIH0pIC8vIFRoZSBwaXBlIGNhbiBub3cgYmUgcHVyZVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRvclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBBWFRyYW5zbGF0aW9uU2VydmljZSkge31cblxuICB0cmFuc2Zvcm0oa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICgha2V5KSB7XG4gICAgICByZXR1cm4gb2YoJycpOyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JzZXJ2YWJsZSBpZiB0aGUga2V5IGlzIG5vdCBwcm92aWRlZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnRyYW5zbGF0ZSQoa2V5LCBvcHRpb25zKTtcbiAgfVxufVxuIl19
|