@decaf-ts/for-angular 0.0.17 → 0.0.19
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/assets/i18n/en.json +3 -73
- package/assets/i18n/pt.json +5 -74
- package/components/crud-field/crud-field.component.d.ts +12 -3
- package/components/crud-form/crud-form.component.d.ts +36 -14
- package/components/empty-state/empty-state.component.d.ts +9 -10
- package/components/fieldset/fieldset.component.d.ts +9 -0
- package/components/filter/filter.component.d.ts +11 -2
- package/engine/NgxBaseComponent.d.ts +39 -39
- package/engine/NgxCrudFormField.d.ts +2 -1
- package/engine/NgxRenderingEngine.d.ts +44 -16
- package/engine/interfaces.d.ts +10 -0
- package/engine/types.d.ts +8 -0
- package/esm2022/components/crud-field/crud-field.component.mjs +23 -3
- package/esm2022/components/crud-form/crud-form.component.mjs +33 -18
- package/esm2022/components/empty-state/empty-state.component.mjs +11 -10
- package/esm2022/components/fieldset/fieldset.component.mjs +7 -4
- package/esm2022/components/filter/filter.component.mjs +16 -6
- package/esm2022/components/layout/layout.component.mjs +3 -3
- package/esm2022/components/list-item/list-item.component.mjs +4 -4
- package/esm2022/components/pagination/pagination.component.mjs +6 -6
- package/esm2022/engine/NgxBaseComponent.mjs +48 -53
- package/esm2022/engine/NgxCrudFormField.mjs +1 -1
- package/esm2022/engine/NgxRenderingEngine.mjs +20 -4
- package/esm2022/engine/interfaces.mjs +1 -1
- package/esm2022/engine/types.mjs +1 -1
- package/esm2022/helpers/utils.mjs +49 -32
- package/esm2022/i18n/Loader.mjs +82 -0
- package/fesm2022/decaf-ts-for-angular.mjs +288 -134
- package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
- package/helpers/utils.d.ts +42 -17
- package/i18n/Loader.d.ts +48 -0
- package/package.json +10 -1
|
@@ -190,20 +190,16 @@ export function isNotUndefined(prop) {
|
|
|
190
190
|
* @memberOf module:for-angular
|
|
191
191
|
*/
|
|
192
192
|
export function getLocaleFromClassName(instance, suffix) {
|
|
193
|
-
if (typeof instance !==
|
|
194
|
-
instance =
|
|
195
|
-
instance.name || instance?.constructor?.name;
|
|
193
|
+
if (typeof instance !== Primitives.STRING)
|
|
194
|
+
instance = instance.name || instance?.constructor?.name;
|
|
196
195
|
let name = instance;
|
|
197
196
|
if (suffix)
|
|
198
197
|
name = `${instance}${suffix.charAt(0).toUpperCase() + suffix.slice(1)}`;
|
|
199
|
-
name = name
|
|
200
|
-
.replace(/_|-/g, '')
|
|
201
|
-
.replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => {
|
|
198
|
+
name = name.replace(/_|-/g, '').replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => {
|
|
202
199
|
if (index > 1)
|
|
203
200
|
word = '.' + word;
|
|
204
201
|
return word.toLowerCase();
|
|
205
|
-
})
|
|
206
|
-
.split('.');
|
|
202
|
+
}).split('.');
|
|
207
203
|
if (name.length < 3)
|
|
208
204
|
return name.reverse().join('.');
|
|
209
205
|
const preffix = name[name.length - 1];
|
|
@@ -211,27 +207,6 @@ export function getLocaleFromClassName(instance, suffix) {
|
|
|
211
207
|
name = name.join('_');
|
|
212
208
|
return `${preffix}.${name}`;
|
|
213
209
|
}
|
|
214
|
-
/**
|
|
215
|
-
* @description Generates a localized string by combining locale and phrase
|
|
216
|
-
* @summary This utility function creates a properly formatted locale string by combining
|
|
217
|
-
* a locale identifier with a phrase. It handles edge cases such as empty phrases,
|
|
218
|
-
* missing locales, and phrases that already include the locale prefix. This function
|
|
219
|
-
* is useful for ensuring consistent formatting of localized strings throughout the application.
|
|
220
|
-
*
|
|
221
|
-
* @param {string} locale - The locale identifier (e.g., 'en', 'fr')
|
|
222
|
-
* @param {string | undefined} phrase - The phrase to localize
|
|
223
|
-
* @return {string} The formatted locale string, or empty string if phrase is undefined
|
|
224
|
-
*
|
|
225
|
-
* @function generateLocaleFromString
|
|
226
|
-
* @memberOf module:for-angular
|
|
227
|
-
*/
|
|
228
|
-
export function generateLocaleFromString(locale, phrase) {
|
|
229
|
-
if (!phrase)
|
|
230
|
-
return '';
|
|
231
|
-
if (!locale || phrase.includes(`${locale}.`))
|
|
232
|
-
return phrase;
|
|
233
|
-
return `${locale}.${phrase}`;
|
|
234
|
-
}
|
|
235
210
|
/**
|
|
236
211
|
* @description Retrieves the current locale language
|
|
237
212
|
* @summary This utility function gets the current locale language based on the user's browser settings.
|
|
@@ -402,18 +377,60 @@ export function dataMapper(data, mapper, props) {
|
|
|
402
377
|
const item = itemMapper(curr, mapper, props);
|
|
403
378
|
const hasValues = [...new Set(Object.values(item))].filter((value) => value).length >
|
|
404
379
|
0;
|
|
405
|
-
// caso o item filtrado não possua nenhum valor, passar o objeto original
|
|
406
380
|
accum.push(hasValues ? item : curr);
|
|
407
381
|
return accum;
|
|
408
382
|
}, []);
|
|
409
383
|
}
|
|
384
|
+
/**
|
|
385
|
+
* @description Removes focus from the currently active DOM element
|
|
386
|
+
* @summary This utility function blurs the currently focused element in the document,
|
|
387
|
+
* effectively removing focus traps that might prevent proper navigation or keyboard
|
|
388
|
+
* interaction. It safely accesses the document's activeElement and calls blur() if
|
|
389
|
+
* an element is currently focused. This is useful for accessibility and user experience
|
|
390
|
+
* improvements, particularly when closing modals or dialogs.
|
|
391
|
+
*
|
|
392
|
+
* @return {void}
|
|
393
|
+
*
|
|
394
|
+
* @function removeFocusTrap
|
|
395
|
+
* @memberOf module:for-angular
|
|
396
|
+
*/
|
|
410
397
|
export function removeFocusTrap() {
|
|
411
398
|
const doc = getWindowDocument();
|
|
412
399
|
if (doc?.activeElement)
|
|
413
400
|
doc.activeElement?.blur();
|
|
414
401
|
}
|
|
415
|
-
|
|
402
|
+
/**
|
|
403
|
+
* @description Cleans and normalizes whitespace in a string value
|
|
404
|
+
* @summary This utility function trims leading and trailing whitespace from a string
|
|
405
|
+
* and replaces multiple consecutive whitespace characters with a single space.
|
|
406
|
+
* Optionally converts the result to lowercase for consistent text processing.
|
|
407
|
+
* This is useful for normalizing user input, search terms, or data sanitization.
|
|
408
|
+
*
|
|
409
|
+
* @param {string} value - The string value to clean and normalize
|
|
410
|
+
* @param {boolean} [lowercase=false] - Whether to convert the result to lowercase
|
|
411
|
+
* @return {string} The cleaned and normalized string
|
|
412
|
+
*
|
|
413
|
+
* @function cleanSpaces
|
|
414
|
+
* @memberOf module:for-angular
|
|
415
|
+
*/
|
|
416
|
+
export function cleanSpaces(value = "", lowercase = false) {
|
|
416
417
|
value = `${value}`.trim().replace(/\s+/g, ' ');
|
|
417
418
|
return lowercase ? value.toLowerCase() : value;
|
|
418
419
|
}
|
|
419
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hlbHBlcnMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRCxJQUFJLGtCQUF1QyxDQUFDO0FBRTVDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxJQUFJLENBQUMsa0JBQWtCO1FBQ3JCLGtCQUFrQixHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUNuRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsVUFBa0IsV0FBVztJQUM3RCxJQUFJLENBQUMsT0FBTztRQUNWLE9BQU8sU0FBUyxFQUFFLENBQUM7SUFDckIsTUFBTSxHQUFHLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDeEIsT0FBTyxDQUNMLFNBQVMsRUFBRTtRQUNYLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLFdBQVcsRUFBRTtRQUNqRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUMvQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLElBQVksRUFDWixNQUFlLEVBQ2YsS0FBYztJQUVkLE1BQU0sSUFBSSxHQUFHLE1BQU0s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QVMsR0FDYixDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQ3hFLENBQUMsQ0FBQztRQUNKLHlFQUF5RTtRQUN6RSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNULENBQUM7QUFHRCxNQUFNLFVBQVUsZUFBZTtJQUM3QixNQUFNLEdBQUcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2hDLElBQUcsR0FBRyxFQUFFLGFBQWE7UUFDbEIsR0FBRyxDQUFDLGFBQTZCLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDL0MsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYSxFQUFFLFNBQVMsR0FBRyxLQUFLO0lBQzFELEtBQUssR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEluamVjdGFibGVSZWdpc3RyeUltcCwgSW5qZWN0YWJsZXNSZWdpc3RyeSB9IGZyb20gJ0BkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgUHJpbWl0aXZlcyB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBLZXlWYWx1ZSwgU3RyaW5nT3JCb29sZWFuLCB9IGZyb20gJy4uL2VuZ2luZS90eXBlcyc7XG5pbXBvcnQgeyBGdW5jdGlvbkxpa2UgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcblxubGV0IGluamVjdGFibGVSZWdpc3RyeTogSW5qZWN0YWJsZXNSZWdpc3RyeTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGluamVjdGFibGVzIHJlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHNpbmdsZXRvbiBwYXR0ZXJuIGZvciB0aGUgSW5qZWN0YWJsZXNSZWdpc3RyeS5cbiAqIEl0IHJldHVybnMgdGhlIGV4aXN0aW5nIHJlZ2lzdHJ5IGluc3RhbmNlIGlmIG9uZSBleGlzdHMsIG9yIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2VcbiAqIGlmIG5vbmUgZXhpc3RzLiBUaGUgcmVnaXN0cnkgaXMgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgaW5qZWN0YWJsZSBkZXBlbmRlbmNpZXNcbiAqIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEByZXR1cm4ge0luamVjdGFibGVzUmVnaXN0cnl9IFRoZSBzaW5nbGV0b24gaW5qZWN0YWJsZXMgcmVnaXN0cnkgaW5zdGFuY2VcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0SW5qZWN0YWJsZXNSZWdpc3RyeVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5qZWN0YWJsZXNSZWdpc3RyeSgpOiBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgaWYgKCFpbmplY3RhYmxlUmVnaXN0cnkpXG4gICAgaW5qZWN0YWJsZVJlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpO1xuICByZXR1cm4gaW5qZWN0YWJsZVJlZ2lzdHJ5O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGVcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBydW5uaW5nIGluIGEgZGV2ZWxvcG1lbnRcbiAqIGVudmlyb25tZW50LiBJdCB1c2VzIEFuZ3VsYXIncyBpc0Rldk1vZGUoKSBmdW5jdGlvbiBhbmQgYWxzbyBjaGVja3MgdGhlIHdpbmRvdyBjb250ZXh0XG4gKiBhbmQgaG9zdG5hbWUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgY29udGV4dCBwYXJhbWV0ZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBlbmFibGluZ1xuICogZGV2ZWxvcG1lbnQtc3BlY2lmaWMgZmVhdHVyZXMgb3IgbG9nZ2luZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbnRleHQ9J2xvY2FsaG9zdCddIC0gVGhlIGNvbnRleHQgc3RyaW5nIHRvIGNoZWNrIGFnYWluc3QgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQGZ1bmN0aW9uIGlzRGV2ZWxvcG1lbnRNb2RlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RldmVsb3BtZW50TW9kZShjb250ZXh0OiBzdHJpbmcgPSAnbG9jYWxob3N0Jyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbnRleHQpXG4gICAgcmV0dXJuIGlzRGV2TW9kZSgpO1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coKTtcbiAgcmV0dXJuIChcbiAgICBpc0Rldk1vZGUoKSB8fFxuICAgIHdpbj8uWydlbnYnXT8uWydDT05URVhUJ10udG9Mb3dlckNhc2UoKSAhPT0gY29udGV4dC50b0xvd2VyQ2FzZSgpIHx8XG4gICAgd2luPy5bJ2xvY2F0aW9uJ10/Lmhvc3RuYW1lPy5pbmNsdWRlcyhjb250ZXh0KVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHRvIHRoZSBkb2N1bWVudCB3aW5kb3dcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbmQgZGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCB0byB0aGUgYnJvd3NlciB3aW5kb3cuXG4gKiBJdCdzIHVzZWZ1bCBmb3IgY3Jvc3MtY29tcG9uZW50IGNvbW11bmljYXRpb24gb3IgZm9yIHRyaWdnZXJpbmcgYXBwbGljYXRpb24td2lkZSBldmVudHMuXG4gKiBUaGUgZnVuY3Rpb24gYWxsb3dzIHNwZWNpZnlpbmcgdGhlIGV2ZW50IG5hbWUsIGRldGFpbCBkYXRhLCBhbmQgYWRkaXRpb25hbCBldmVudCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBldmVudCB0byBkaXNwYXRjaFxuICogQHBhcmFtIHt1bmtub3dufSBkZXRhaWwgLSBUaGUgZGF0YSB0byBpbmNsdWRlIGluIHRoZSBldmVudCdzIGRldGFpbCBwcm9wZXJ0eVxuICogQHBhcmFtIHtvYmplY3R9IFtwcm9wc10gLSBPcHRpb25hbCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHRoZSBjdXN0b20gZXZlbnRcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHdpbmRvd0V2ZW50RW1pdHRlclxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gd2luZG93RXZlbnRFbWl0dGVyKFxuICBuYW1lOiBzdHJpbmcsXG4gIGRldGFpbDogdW5rbm93bixcbiAgcHJvcHM/OiBvYmplY3Rcbik6IHZvaWQge1xuICBjb25zdCBkYXRhID0gT2JqZWN0LmFzc2lnbihcbiAgICB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgIGRldGFpbDogZGV0YWlsLFxuICAgIH0sXG4gICAgcHJvcHMgfHwge31cbiAgKTtcbiAgKGdldFdpbmRvdygpIGFzIFdpbmRvdykuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQobmFtZSwgZGF0YSkpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcHJvcGVydHkgZnJvbSB0aGUgd2luZG93J3MgZG9jdW1lbnQgb2JqZWN0XG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgc2FmZSB3YXkgdG8gYWNjZXNzIHByb3BlcnRpZXMgb24gdGhlIHdpbmRvdydzIGRvY3VtZW50IG9iamVjdC5cbiAqIEl0IHVzZXMgdGhlIGdldFdpbmRvd0RvY3VtZW50IGZ1bmN0aW9uIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZG9jdW1lbnQsIHRoZW4gYWNjZXNzZXNcbiAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFRoaXMgaXMgdXNlZnVsIGZvciBicm93c2VyIGVudmlyb25tZW50IGludGVyYWN0aW9ucyB0aGF0IG5lZWRcbiAqIHRvIGFjY2VzcyBkb2N1bWVudCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0cmlldmUgZnJvbSB0aGUgZG9jdW1lbnQgb2JqZWN0XG4gKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBvciB1bmRlZmluZWQgaWYgdGhlIGRvY3VtZW50IG9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3RcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0T25XaW5kb3dEb2N1bWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T25XaW5kb3dEb2N1bWVudChrZXk6IHN0cmluZyk6IERvY3VtZW50IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZG9jID0gZ2V0V2luZG93RG9jdW1lbnQoKT8uW2tleSBhcyBrZXlvZiBEb2N1bWVudF07XG4gIHJldHVybiBkb2MgaW5zdGFuY2VvZiBEb2N1bWVudCA/XG4gICAgZG9jIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGRvY3VtZW50IG9iamVjdCBmcm9tIHRoZSB3aW5kb3dcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBzYWZlIHdheSB0byBhY2Nlc3MgdGhlIGRvY3VtZW50IG9iamVjdCBmcm9tIHRoZSB3aW5kb3cuXG4gKiBJdCB1c2VzIHRoZSBnZXRPbldpbmRvdyBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgJ2RvY3VtZW50JyBwcm9wZXJ0eSBmcm9tIHRoZSB3aW5kb3cgb2JqZWN0LlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGJyb3dzZXIgZW52aXJvbm1lbnQgaW50ZXJhY3Rpb25zIHRoYXQgbmVlZCBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50LlxuICpcbiAqIEByZXR1cm4ge0RvY3VtZW50IHwgdW5kZWZpbmVkfSBUaGUgd2luZG93J3MgZG9jdW1lbnQgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgaXQgZG9lc24ndCBleGlzdFxuICpcbiAqIEBmdW5jdGlvbiBnZXRXaW5kb3dEb2N1bWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93RG9jdW1lbnQoKTogRG9jdW1lbnQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0T25XaW5kb3coJ2RvY3VtZW50JykgYXMgRG9jdW1lbnQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHByb3BlcnR5IGZyb20gdGhlIHdpbmRvdyBvYmplY3RcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBzYWZlIHdheSB0byBhY2Nlc3MgcHJvcGVydGllcyBvbiB0aGUgd2luZG93IG9iamVjdC5cbiAqIEl0IHVzZXMgdGhlIGdldFdpbmRvdyBmdW5jdGlvbiB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHdpbmRvdywgdGhlbiBhY2Nlc3Nlc1xuICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gVGhpcyBpcyB1c2VmdWwgZm9yIGJyb3dzZXIgZW52aXJvbm1lbnQgaW50ZXJhY3Rpb25zIHRoYXQgbmVlZFxuICogdG8gYWNjZXNzIHdpbmRvdyBwcm9wZXJ0aWVzIG9yIEFQSXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZSBmcm9tIHRoZSB3aW5kb3cgb2JqZWN0XG4gKiBAcmV0dXJuIHt1bmtub3duIHwgdW5kZWZpbmVkfSBUaGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSwgb3IgdW5kZWZpbmVkIGlmIHRoZSB3aW5kb3cgb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdFxuICpcbiAqIEBmdW5jdGlvbiBnZXRPbldpbmRvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T25XaW5kb3coa2V5OiBzdHJpbmcpOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFdpbmRvdygpPy5ba2V5XTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyBhIHByb3BlcnR5IG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2F5IHRvIHNldCBwcm9wZXJ0aWVzIG9uIHRoZSB3aW5kb3cgb2JqZWN0LlxuICogSXQgdXNlcyB0aGUgZ2V0V2luZG93IGZ1bmN0aW9uIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgd2luZG93LCB0aGVuIHNldHNcbiAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3RvcmluZ1xuICogZ2xvYmFsIGRhdGEgb3IgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBhY2Nlc3NpYmxlIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIHByb3BlcnR5XG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBmdW5jdGlvbiBzZXRPbldpbmRvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0T25XaW5kb3coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGdldFdpbmRvdygpW2tleV0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBnbG9iYWwgd2luZG93IG9iamVjdFxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHNhZmUgd2F5IHRvIGFjY2VzcyB0aGUgZ2xvYmFsIHdpbmRvdyBvYmplY3QuXG4gKiBJdCB1c2VzIGdsb2JhbFRoaXMgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIGRpZmZlcmVudCBKYXZhU2NyaXB0IGVudmlyb25tZW50cy5cbiAqIFRoaXMgaXMgdGhlIGNvcmUgZnVuY3Rpb24gdXNlZCBieSBvdGhlciB3aW5kb3ctcmVsYXRlZCB1dGlsaXR5IGZ1bmN0aW9ucyB0b1xuICogYWNjZXNzIHRoZSB3aW5kb3cgb2JqZWN0LlxuICpcbiAqIEByZXR1cm4ge1dpbmRvd30gVGhlIGdsb2JhbCB3aW5kb3cgb2JqZWN0XG4gKlxuICogQGZ1bmN0aW9uIGdldFdpbmRvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93KCk6IFdpbmRvdyAmIEtleVZhbHVlIHtcbiAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIEtleVZhbHVlKT8uWyd3aW5kb3cnXSBhcyBXaW5kb3cgJiBLZXlWYWx1ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSB3aWR0aCBvZiB0aGUgYnJvd3NlciB3aW5kb3dcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBnZXQgdGhlIGN1cnJlbnQgd2lkdGggb2YgdGhlIGJyb3dzZXIgd2luZG93LlxuICogSXQgdXNlcyB0aGUgZ2V0T25XaW5kb3cgZnVuY3Rpb24gdG8gYWNjZXNzIHRoZSAnaW5uZXJXaWR0aCcgcHJvcGVydHkgb2YgdGhlIHdpbmRvdyBvYmplY3QuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVzcG9uc2l2ZSBkZXNpZ24gaW1wbGVtZW50YXRpb25zIGFuZCB2aWV3cG9ydC1iYXNlZCBjYWxjdWxhdGlvbnMuXG4gKlxuICogQHJldHVybiB7bnVtYmVyIHwgdW5kZWZpbmVkfSBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgYnJvd3NlciB3aW5kb3cgaW4gcGl4ZWxzXG4gKlxuICogQGZ1bmN0aW9uIGdldFdpbmRvd1dpZHRoXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3dXaWR0aCgpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0T25XaW5kb3coJ2lubmVyV2lkdGgnKSBhcyBudW1iZXIgfHwgMDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdmFsdWUgaXMgIG5vdCB1bmRlZmluZWRcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiB2YWx1ZSBpcyBub3QgdW5kZWZpbmVkLlxuICogSXQncyBhIHNpbXBsZSB3cmFwcGVyIHRoYXQgbWFrZXMgY29kZSBtb3JlIHJlYWRhYmxlIHdoZW4gY2hlY2tpbmcgZm9yIGRlZmluZWQgdmFsdWVzLlxuICogVGhlIGZ1bmN0aW9uIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGNoZWNraW5nIFN0cmluZ09yQm9vbGVhbiBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nT3JCb29sZWFuIHwgdW5kZWZpbmVkfSBwcm9wIC0gVGhlIHByb3BlcnR5IHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgdW5kZWZpbmVkLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAZnVuY3Rpb24gaXNOb3RVbmRlZmluZWRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm90VW5kZWZpbmVkKHByb3A6IFN0cmluZ09yQm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHByb3AgIT09IHVuZGVmaW5lZCkgYXMgYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbG9jYWxlIHN0cmluZyBmcm9tIGEgY2xhc3MgbmFtZSBvciBpbnN0YW5jZVxuICogQHN1bW1hcnkgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNvbnZlcnRzIGEgY2xhc3MgbmFtZSBvciBpbnN0YW5jZSBpbnRvIGEgbG9jYWxlIHN0cmluZ1xuICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gcHVycG9zZXMuIEl0IGhhbmRsZXMgZGlmZmVyZW50IGlucHV0IHR5cGVzXG4gKiAoc3RyaW5nLCBmdW5jdGlvbiwgb3Igb2JqZWN0KSBhbmQgYXBwbGllcyBmb3JtYXR0aW5nIHJ1bGVzIHRvIGdlbmVyYXRlIGEgY29uc2lzdGVudFxuICogbG9jYWxlIGlkZW50aWZpZXIuIEZvciBzaG9ydCBuYW1lcyAobGVzcyB0aGFuIDMgcGFydHMpLCBpdCByZXZlcnNlcyB0aGUgZG90LXNlcGFyYXRlZFxuICogc3RyaW5nLiBGb3IgbG9uZ2VyIG5hbWVzLCBpdCB1c2VzIHRoZSBsYXN0IHBhcnQgYXMgYSBwcmVmaXggYW5kIGpvaW5zIHRoZSByZXN0IHdpdGhcbiAqIHVuZGVyc2NvcmVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9uTGlrZXxvYmplY3R9IGluc3RhbmNlIC0gVGhlIGlucHV0IHRvIGdlbmVyYXRlIHRoZSBsb2NhbGUgZnJvbSAoY2xhc3MgbmFtZSwgY29uc3RydWN0b3IsIG9yIGluc3RhbmNlKVxuICogQHBhcmFtIHtzdHJpbmd9IFtzdWZmaXhdIC0gT3B0aW9uYWwgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgaW5zdGFuY2UgbmFtZSBiZWZvcmUgcHJvY2Vzc2luZ1xuICogQHJldHVybiB7c3RyaW5nfSBBIGZvcm1hdHRlZCBsb2NhbGUgc3RyaW5nIGRlcml2ZWQgZnJvbSB0aGUgaW5wdXRcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0TG9jYWxlRnJvbUNsYXNzTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxlRnJvbUNsYXNzTmFtZShcbiAgaW5zdGFuY2U6IHN0cmluZyB8IEZ1bmN0aW9uTGlrZSB8IG9iamVjdCxcbiAgc3VmZml4Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGluc3RhbmNlICE9PSAnc3RyaW5nJylcbiAgICBpbnN0YW5jZSA9XG4gICAgICAoaW5zdGFuY2UgYXMgRnVuY3Rpb25MaWtlKS5uYW1lIHx8IChpbnN0YW5jZSBhcyBvYmplY3QpPy5jb25zdHJ1Y3Rvcj8ubmFtZTtcblxuICBsZXQgbmFtZTogc3RyaW5nIHwgc3RyaW5nW10gPSBpbnN0YW5jZTtcblxuICBpZiAoc3VmZml4KSBuYW1lID0gYCR7aW5zdGFuY2V9JHtzdWZmaXguY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdWZmaXguc2xpY2UoMSl9YDtcblxuICBuYW1lID0gbmFtZVxuICAgIC5yZXBsYWNlKC9ffC0vZywgJycpXG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoaW5kZXggPiAxKSB3b3JkID0gJy4nICsgd29yZDtcbiAgICAgIHJldHVybiB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSlcbiAgICAuc3BsaXQoJy4nKTtcblxuICBpZiAobmFtZS5sZW5ndGggPCAzKVxuICAgIHJldHVybiBuYW1lLnJldmVyc2UoKS5qb2luKCcuJyk7XG5cbiAgY29uc3QgcHJlZmZpeCA9IG5hbWVbbmFtZS5sZW5ndGggLSAxXTtcbiAgbmFtZS5wb3AoKTtcbiAgbmFtZSA9IG5hbWUuam9pbignXycpO1xuICByZXR1cm4gYCR7cHJlZmZpeH0uJHtuYW1lfWA7XG5cblxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBsb2NhbGl6ZWQgc3RyaW5nIGJ5IGNvbWJpbmluZyBsb2NhbGUgYW5kIHBocmFzZVxuICogQHN1bW1hcnkgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNyZWF0ZXMgYSBwcm9wZXJseSBmb3JtYXR0ZWQgbG9jYWxlIHN0cmluZyBieSBjb21iaW5pbmdcbiAqIGEgbG9jYWxlIGlkZW50aWZpZXIgd2l0aCBhIHBocmFzZS4gSXQgaGFuZGxlcyBlZGdlIGNhc2VzIHN1Y2ggYXMgZW1wdHkgcGhyYXNlcyxcbiAqIG1pc3NpbmcgbG9jYWxlcywgYW5kIHBocmFzZXMgdGhhdCBhbHJlYWR5IGluY2x1ZGUgdGhlIGxvY2FsZSBwcmVmaXguIFRoaXMgZnVuY3Rpb25cbiAqIGlzIHVzZWZ1bCBmb3IgZW5zdXJpbmcgY29uc2lzdGVudCBmb3JtYXR0aW5nIG9mIGxvY2FsaXplZCBzdHJpbmdzIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGUgLSBUaGUgbG9jYWxlIGlkZW50aWZpZXIgKGUuZy4sICdlbicsICdmcicpXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gcGhyYXNlIC0gVGhlIHBocmFzZSB0byBsb2NhbGl6ZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGxvY2FsZSBzdHJpbmcsIG9yIGVtcHR5IHN0cmluZyBpZiBwaHJhc2UgaXMgdW5kZWZpbmVkXG4gKlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlTG9jYWxlRnJvbVN0cmluZ1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVMb2NhbGVGcm9tU3RyaW5nKFxuICBsb2NhbGU6IHN0cmluZyxcbiAgcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHN0cmluZyB7XG4gIGlmICghcGhyYXNlKSByZXR1cm4gJyc7XG4gIGlmICghbG9jYWxlIHx8IHBocmFzZS5pbmNsdWRlcyhgJHtsb2NhbGV9LmApKSByZXR1cm4gcGhyYXNlO1xuICByZXR1cm4gYCR7bG9jYWxlfS4ke3BocmFzZX1gO1xufVxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudCBsb2NhbGUgbGFuZ3VhZ2VcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBnZXRzIHRoZSBjdXJyZW50IGxvY2FsZSBsYW5ndWFnZSBiYXNlZCBvbiB0aGUgdXNlcidzIGJyb3dzZXIgc2V0dGluZ3MuXG4gKiBJdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgd2F5IHRvIGFjY2VzcyB0aGUgdXNlcidzIGxhbmd1YWdlIHByZWZlcmVuY2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgYnJvd3NlcidzIG5hdmlnYXRvci5sYW5ndWFnZSB2YWx1ZSwgZGVmYXVsdGluZyB0byAnZW4nIGlmIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY3VycmVudCBsb2NhbGUgbGFuZ3VhZ2UgKGUuZy4sICdlbicsICdmcicpXG4gKlxuICogQGZ1bmN0aW9uIGdldExvY2FsZUxhbmd1YWdlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbGVMYW5ndWFnZSgpOiBzdHJpbmcge1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coKTtcbiAgcmV0dXJuICh3aW4gYXMgV2luZG93KS5uYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgXCJlblwiO1xuICAvLyByZXR1cm4gd2luPy5bV0lORE9XX0tFWVMuTEFOR1VBR0VfU0VMRUNURURdIHx8ICh3aW4ubmF2aWdhdG9yLmxhbmd1YWdlIHx8ICcnKS5zcGxpdCgnLScpWzBdIHx8IFwiZW5cIjtcbn1cblxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHJhbmRvbSBzdHJpbmcgb3IgbnVtYmVyIG9mIHNwZWNpZmllZCBsZW5ndGhcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjcmVhdGVzIGEgcmFuZG9tIHN0cmluZyBvZiBhIHNwZWNpZmllZCBsZW5ndGguXG4gKiBJdCBjYW4gZ2VuZXJhdGUgZWl0aGVyIGFscGhhbnVtZXJpYyBzdHJpbmdzIChpbmNsdWRpbmcgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycylcbiAqIG9yIG51bWVyaWMtb25seSBzdHJpbmdzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcmFuZG9tIElEcywgdGVtcG9yYXJ5IHBhc3N3b3JkcyxcbiAqIG9yIG90aGVyIHJhbmRvbSBpZGVudGlmaWVycyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD04XSAtIFRoZSBsZW5ndGggb2YgdGhlIHJhbmRvbSB2YWx1ZSB0byBnZW5lcmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbb25seU51bWJlcnM9ZmFsc2VdIC0gV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IG51bWVyaWMgY2hhcmFjdGVyc1xuICogQHJldHVybiB7c3RyaW5nfSBBIHJhbmRvbWx5IGdlbmVyYXRlZCBzdHJpbmcgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggYW5kIGNoYXJhY3RlciBzZXRcbiAqXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21WYWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21WYWx1ZShsZW5ndGg6IG51bWJlciA9IDgsIG9ubHlOdW1iZXJzOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICBjb25zdCBjaGFycyA9IG9ubHlOdW1iZXJzXG4gICAgPyAnMDEyMzQ1Njc4OSdcbiAgICA6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICByZXN1bHQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGJvb2xlYW4gb3IgYSBib29sZWFuIHZhbHVlIHRvIGEgYm9vbGVhbiB0eXBlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7KCd0cnVlJyB8ICdmYWxzZScgfCBib29sZWFuKX0gcHJvcCAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBDYW4gYmUgdGhlIHN0cmluZyAndHJ1ZScsICdmYWxzZScsIG9yIGEgYm9vbGVhbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgYm9vbGVhbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgdmFsdWUuIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgdGhlIHN0cmluZyAndHJ1ZScgb3IgYm9vbGVhbiB0cnVlLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0Jvb2xlYW4ocHJvcDogJ3RydWUnIHwgJ2ZhbHNlJyB8IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgaWYodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKVxuICAgIHByb3AgPSBwcm9wLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTtcbiAgcmV0dXJuIHByb3A7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgRGF0ZSB8IG51bWJlcil9IGRhdGUgLSBUaGUgdmFsdWUgdG8gY2hlY2suIENhbiBiZSBhIERhdGUgb2JqZWN0LCBhIHRpbWVzdGFtcCBudW1iZXIsIG9yIGEgZGF0ZSBzdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdCAobm90IE5hTiksIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKGRhdGUgYXMgdW5rbm93biBhcyBudW1iZXIpKSB8fCAoKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdFJlZ2V4ID0gbmV3IFJlZ0V4cCgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8pLnRlc3QoZGF0ZSBhcyBzdHJpbmcpXG4gICAgICBpZih0eXBlb2YgZGF0ZSAhPT0gUHJpbWl0aXZlcy5TVFJJTkcgfHwgIShkYXRlIGFzIHN0cmluZyk/LmluY2x1ZGVzKCdUJykgJiYgIXRlc3RSZWdleClcbiAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICBkYXRlID0gKGRhdGUgYXMgc3RyaW5nKS5zcGxpdCgnVCcpWzBdO1xuICAgIGlmKCFuZXcgUmVnRXhwKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLykudGVzdChkYXRlKSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiAhIShuZXcgRGF0ZShkYXRlKSk7XG4gICB9KSgpO1xuICB9IGNhdGNoKGVycm9yOiB1bmtub3duKSB7XG4gICAgZ2V0TG9nZ2VyKGlzVmFsaWREYXRlKS5lcnJvcihlcnJvciBhcyBFcnJvciB8IHN0cmluZyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIGRhdGUgaW50byBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0geyhzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKX0gZGF0ZSAtIFRoZSBkYXRlIHRvIGZvcm1hdC4gQ2FuIGJlIGEgRGF0ZSBvYmplY3QsIGEgdGltZXN0YW1wIG51bWJlciwgb3IgYSBkYXRlIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtsb2NhbGVdIC0gVGhlIGxvY2FsZSB0byB1c2UgZm9yIGZvcm1hdHRpbmcuIElmIG5vdCBwcm92aWRlZCwgdGhlIHN5c3RlbSdzIGxvY2FsZSB3aWxsIGJlIHVzZWRcbiAqIEByZXR1cm4geyhEYXRlIHwgc3RyaW5nKX0gQSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBERC9NTS9ZWVlZIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGxvY2FsZSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIG9yaWdpbmFsIGlucHV0IGFzIGEgc3RyaW5nIGlmIHRoZSBkYXRlIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlciwgbG9jYWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogRGF0ZSB8IHN0cmluZyB7XG5cbiAgaWYoIWxvY2FsZSlcbiAgICBsb2NhbGUgPSBnZXRMb2NhbGVMYW5ndWFnZSgpO1xuXG4gIGlmKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicpXG4gICAgZGF0ZSA9IG5ldyBEYXRlKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJyA/IGRhdGUucmVwbGFjZSgvXFwvL2csICctJykgOiBkYXRlKTtcblxuICBpZighaXNWYWxpZERhdGUoZGF0ZSkpXG4gICAgcmV0dXJuIGAke2RhdGV9YCBhcyBzdHJpbmc7XG4gIGNvbnN0IHIgPSBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwge1xuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgbW9udGg6ICcyLWRpZ2l0J1xuICB9KTtcblxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIHBhcnNlIGEgZGF0ZSBzdHJpbmcsIERhdGUgb2JqZWN0LCBvciBudW1iZXIgaW50byBhIHZhbGlkIERhdGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgRGF0ZSB8IG51bWJlcil9IGRhdGUgLSBUaGUgZGF0ZSB0byBwYXJzZS4gQ2FuIGJlIGEgRGF0ZSBvYmplY3QsIGEgdGltZXN0YW1wIG51bWJlcixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIGRhdGUgc3RyaW5nIGluIHRoZSBmb3JtYXQgXCJERC9NTS9ZWVlZIEhIOk1NOlNTOk1TXCJcbiAqIEByZXR1cm4geyhEYXRlIHwgbnVsbCl9IEEgdmFsaWQgRGF0ZSBvYmplY3QgaWYgcGFyc2luZyBpcyBzdWNjZXNzZnVsLCBvciBudWxsIGlmIHRoZSBkYXRlIGlzIGludmFsaWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb1ZhbGlkRGF0ZShkYXRlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKTogRGF0ZSB8IG51bGwge1xuICBpZihpc1ZhbGlkRGF0ZShkYXRlKSlcbiAgICByZXR1cm4gZGF0ZSBhcyBEYXRlO1xuXG4gIGlmKCFgJHtkYXRlfWAuaW5jbHVkZXMoJy8nKSlcbiAgICByZXR1cm4gbnVsbDtcblxuICBjb25zdCBbZGF0ZVN0cmluZywgdGltZVN0cmluZ10gPSAoZGF0ZSBhcyBzdHJpbmcpLnNwbGl0KCcgJyk7XG4gIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGRhdGVTdHJpbmcuc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgY29uc3QgW2hvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHNdID0gdGltZVN0cmluZy5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xuICBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHMpO1xuXG4gIGlmKCFpc1ZhbGlkRGF0ZShkYXRlKSkge1xuICAgIGNvbnNvbGUud2FybigncGFyc2VUb1ZhbGlkRGF0ZSAtIEludmFsaWQgZGF0ZSBmb3JtYXQnLCBkYXRlKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBkYXRlO1xufVxuXG5cbi8qKlxuICogTWFwcyBhbiBpdGVtIG9iamVjdCB1c2luZyBhIHByb3ZpZGVkIG1hcHBlciBvYmplY3QgYW5kIG9wdGlvbmFsIGFkZGl0aW9uYWwgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBpdGVtIC0gVGhlIHNvdXJjZSBvYmplY3QgdG8gYmUgbWFwcGVkLlxuICogQHBhcmFtIHtLZXlWYWx1ZX0gbWFwcGVyIC0gQW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgbWFwcGluZyBydWxlcy4gS2V5cyByZXByZXNlbnQgdGhlIG5ldyBwcm9wZXJ0eSBuYW1lcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7S2V5VmFsdWV9IFtwcm9wc10gLSBPcHRpb25hbCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG1hcHBlZCBvYmplY3QuXG4gKiBAcmV0dXJucyB7S2V5VmFsdWV9IEEgbmV3IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbWFwcGVkIGFjY29yZGluZyB0byB0aGUgbWFwcGVyIG9iamVjdCBhbmQgaW5jbHVkaW5nIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtTWFwcGVyKGl0ZW06IEtleVZhbHVlLCBtYXBwZXI6IEtleVZhbHVlLCBwcm9wcz86IEtleVZhbHVlKTogS2V5VmFsdWUge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFwcGVyKS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgYXJyYXlWYWx1ZSA9ICh2YWx1ZSBhcyBzdHJpbmcpLnNwbGl0KCcuJyk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJyYXlWYWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgYWNjdW1ba2V5XSA9IGl0ZW0/Llt2YWx1ZSBhcyBzdHJpbmddIHx8ICh2YWx1ZSAhPT0ga2V5ID8gdmFsdWUgOiBcIlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWw7XG5cbiAgICAgICAgZm9yIChjb25zdCBfdmFsdWUgb2YgYXJyYXlWYWx1ZSlcbiAgICAgICAgICB2YWwgPSAhdmFsXG4gICAgICAgICAgICA/IGl0ZW1bX3ZhbHVlXVxuICAgICAgICAgICAgOiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHZhbCkgOiB2YWwpW192YWx1ZV07XG5cbiAgICAgICAgaWYgKGlzVmFsaWREYXRlKG5ldyBEYXRlKHZhbCkpKSB2YWwgPSBgJHtmb3JtYXREYXRlKHZhbCl9YDtcblxuICAgICAgICBhY2N1bVtrZXldID0gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB2YWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyB8fCB7fSwgYWNjdW0pO1xuICB9LCB7fSk7XG59XG5cbi8qKlxuICogTWFwcyBhbiBhcnJheSBvZiBkYXRhIG9iamVjdHMgdXNpbmcgYSBwcm92aWRlZCBtYXBwZXIgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdGluZyBtYXBwZWQgaXRlbXMuXG4gKiBAcGFyYW0ge2FueVtdfSBkYXRhIC0gVGhlIGFycmF5IG9mIGRhdGEgb2JqZWN0cyB0byBiZSBtYXBwZWQuXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBtYXBwZXIgLSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtYXBwaW5nIHJ1bGVzLlxuICogQHBhcmFtIHtLZXlWYWx1ZX0gW3Byb3BzXSAtIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbWFwcGVkIGl0ZW1zLlxuICpcbiAqIEByZXR1cm5zIHtUW119IC0gVGhlIGFycmF5IG9mIG1hcHBlZCBpdGVtcy4gSWYgYW4gaXRlbSBpbiB0aGUgb3JpZ2luYWwgYXJyYXkgZG9lcyBub3QgaGF2ZSBhbnkgbm9uLW51bGwgdmFsdWVzIGFmdGVyIG1hcHBpbmcsXG4gKiB0aGUgb3JpZ2luYWwgaXRlbSBpcyByZXR1cm5lZCBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YU1hcHBlcjxUPihkYXRhOiBUW10sIG1hcHBlcjogS2V5VmFsdWUsIHByb3BzPzogS2V5VmFsdWUpOiBUW10ge1xuICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSByZXR1cm4gW107XG4gIHJldHVybiBkYXRhLnJlZHVjZSgoYWNjdW06IFRbXSwgY3VycikgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSBpdGVtTWFwcGVyKGN1cnIgYXMgS2V5VmFsdWUsIG1hcHBlciwgcHJvcHMpIGFzIFQ7XG4gICAgY29uc3QgaGFzVmFsdWVzID1cbiAgICAgIFsuLi5uZXcgU2V0KE9iamVjdC52YWx1ZXMoaXRlbSBhcyBUW10pKV0uZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUpLmxlbmd0aCA+XG4gICAgICAwO1xuICAgIC8vIGNhc28gbyBpdGVtIGZpbHRyYWRvIG7Do28gcG9zc3VhIG5lbmh1bSB2YWxvciwgcGFzc2FyIG8gb2JqZXRvIG9yaWdpbmFsXG4gICAgYWNjdW0ucHVzaChoYXNWYWx1ZXMgPyBpdGVtIDogY3Vycik7XG4gICAgcmV0dXJuIGFjY3VtO1xuICB9LCBbXSk7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZvY3VzVHJhcCgpOiB2b2lkIHtcbiAgY29uc3QgZG9jID0gZ2V0V2luZG93RG9jdW1lbnQoKTtcbiAgaWYoZG9jPy5hY3RpdmVFbGVtZW50KVxuICAgIChkb2MuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk/LmJsdXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU3BhY2VzKHZhbHVlOiBzdHJpbmcsIGxvd2VyY2FzZSA9IGZhbHNlKTogc3RyaW5nIHtcbiAgdmFsdWUgPSBgJHt2YWx1ZX1gLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gIHJldHVybiBsb3dlcmNhc2UgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdmFsdWU7XG59XG4iXX0=
|
|
420
|
+
/**
|
|
421
|
+
* @description Determines if the user's system is currently in dark mode
|
|
422
|
+
* @summary This function checks the user's color scheme preference using the CSS media query
|
|
423
|
+
* '(prefers-color-scheme: dark)'. It returns a boolean indicating whether the system is
|
|
424
|
+
* currently set to dark mode. This is useful for implementing theme-aware functionality
|
|
425
|
+
* and adjusting UI elements based on the user's preferred color scheme.
|
|
426
|
+
*
|
|
427
|
+
* @return {Promise<boolean>} True if the system is in dark mode, false otherwise
|
|
428
|
+
*
|
|
429
|
+
* @function isDarkMode
|
|
430
|
+
* @memberOf module:for-angular
|
|
431
|
+
*/
|
|
432
|
+
export async function isDarkMode() {
|
|
433
|
+
const { matches } = getWindow().matchMedia('(prefers-color-scheme: dark)');
|
|
434
|
+
return matches;
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hlbHBlcnMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRCxJQUFJLGtCQUF1QyxDQUFDO0FBRTVDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxJQUFJLENBQUMsa0JBQWtCO1FBQ3JCLGtCQUFrQixHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUNuRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsVUFBa0IsV0FBVztJQUM3RCxJQUFJLENBQUMsT0FBTztRQUNWLE9BQU8sU0FBUyxFQUFFLENBQUM7SUFDckIsTUFBTSxHQUFHLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDeEIsT0FBTyxDQUNMLFNBQVMsRUFBRTtRQUNYLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLFdBQVcsRUFBRTtRQUNqRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUMvQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLElBQVksRUFDWixNQUFlLEVBQ2YsS0FBYztJQUVkLE1BQU0sSUFBSSxHQUFHLE1BQU0s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LE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFDaEMsSUFBRyxHQUFHLEVBQUUsYUFBYTtRQUNsQixHQUFHLENBQUMsYUFBNkIsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsUUFBZ0IsRUFBRSxFQUFFLFlBQXFCLEtBQUs7SUFDeEUsS0FBSyxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDakQsQ0FBQztBQUdEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVO0lBQzlCLE1BQU0sRUFBQyxPQUFPLEVBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN6RSxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbmplY3RhYmxlUmVnaXN0cnlJbXAsIEluamVjdGFibGVzUmVnaXN0cnkgfSBmcm9tICdAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IFByaW1pdGl2ZXMgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgS2V5VmFsdWUsIFN0cmluZ09yQm9vbGVhbiwgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMnO1xuaW1wb3J0IHsgRnVuY3Rpb25MaWtlIH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzJztcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4uL2Zvci1hbmd1bGFyLm1vZHVsZSc7XG5cbmxldCBpbmplY3RhYmxlUmVnaXN0cnk6IEluamVjdGFibGVzUmVnaXN0cnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBpbmplY3RhYmxlcyByZWdpc3RyeVxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBzaW5nbGV0b24gcGF0dGVybiBmb3IgdGhlIEluamVjdGFibGVzUmVnaXN0cnkuXG4gKiBJdCByZXR1cm5zIHRoZSBleGlzdGluZyByZWdpc3RyeSBpbnN0YW5jZSBpZiBvbmUgZXhpc3RzLCBvciBjcmVhdGVzIGEgbmV3IGluc3RhbmNlXG4gKiBpZiBub25lIGV4aXN0cy4gVGhlIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGluamVjdGFibGUgZGVwZW5kZW5jaWVzXG4gKiB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtJbmplY3RhYmxlc1JlZ2lzdHJ5fSBUaGUgc2luZ2xldG9uIGluamVjdGFibGVzIHJlZ2lzdHJ5IGluc3RhbmNlXG4gKlxuICogQGZ1bmN0aW9uIGdldEluamVjdGFibGVzUmVnaXN0cnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluamVjdGFibGVzUmVnaXN0cnkoKTogSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gIGlmICghaW5qZWN0YWJsZVJlZ2lzdHJ5KVxuICAgIGluamVjdGFibGVSZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKTtcbiAgcmV0dXJuIGluamVjdGFibGVSZWdpc3RyeTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBkZXZlbG9wbWVudCBtb2RlXG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgcnVubmluZyBpbiBhIGRldmVsb3BtZW50XG4gKiBlbnZpcm9ubWVudC4gSXQgdXNlcyBBbmd1bGFyJ3MgaXNEZXZNb2RlKCkgZnVuY3Rpb24gYW5kIGFsc28gY2hlY2tzIHRoZSB3aW5kb3cgY29udGV4dFxuICogYW5kIGhvc3RuYW1lIGFnYWluc3QgdGhlIHByb3ZpZGVkIGNvbnRleHQgcGFyYW1ldGVyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZW5hYmxpbmdcbiAqIGRldmVsb3BtZW50LXNwZWNpZmljIGZlYXR1cmVzIG9yIGxvZ2dpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb250ZXh0PSdsb2NhbGhvc3QnXSAtIFRoZSBjb250ZXh0IHN0cmluZyB0byBjaGVjayBhZ2FpbnN0IHRoZSBjdXJyZW50IGVudmlyb25tZW50XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGUsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEBmdW5jdGlvbiBpc0RldmVsb3BtZW50TW9kZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZXZlbG9wbWVudE1vZGUoY29udGV4dDogc3RyaW5nID0gJ2xvY2FsaG9zdCcpOiBib29sZWFuIHtcbiAgaWYgKCFjb250ZXh0KVxuICAgIHJldHVybiBpc0Rldk1vZGUoKTtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KCk7XG4gIHJldHVybiAoXG4gICAgaXNEZXZNb2RlKCkgfHxcbiAgICB3aW4/LlsnZW52J10/LlsnQ09OVEVYVCddLnRvTG93ZXJDYXNlKCkgIT09IGNvbnRleHQudG9Mb3dlckNhc2UoKSB8fFxuICAgIHdpbj8uWydsb2NhdGlvbiddPy5ob3N0bmFtZT8uaW5jbHVkZXMoY29udGV4dClcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCB0byB0aGUgZG9jdW1lbnQgd2luZG93XG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGRpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgdG8gdGhlIGJyb3dzZXIgd2luZG93LlxuICogSXQncyB1c2VmdWwgZm9yIGNyb3NzLWNvbXBvbmVudCBjb21tdW5pY2F0aW9uIG9yIGZvciB0cmlnZ2VyaW5nIGFwcGxpY2F0aW9uLXdpZGUgZXZlbnRzLlxuICogVGhlIGZ1bmN0aW9uIGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBldmVudCBuYW1lLCBkZXRhaWwgZGF0YSwgYW5kIGFkZGl0aW9uYWwgZXZlbnQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gZXZlbnQgdG8gZGlzcGF0Y2hcbiAqIEBwYXJhbSB7dW5rbm93bn0gZGV0YWlsIC0gVGhlIGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgZXZlbnQncyBkZXRhaWwgcHJvcGVydHlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgY3VzdG9tIGV2ZW50XG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBmdW5jdGlvbiB3aW5kb3dFdmVudEVtaXR0ZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd0V2ZW50RW1pdHRlcihcbiAgbmFtZTogc3RyaW5nLFxuICBkZXRhaWw6IHVua25vd24sXG4gIHByb3BzPzogb2JqZWN0XG4pOiB2b2lkIHtcbiAgY29uc3QgZGF0YSA9IE9iamVjdC5hc3NpZ24oXG4gICAge1xuICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICBkZXRhaWw6IGRldGFpbCxcbiAgICB9LFxuICAgIHByb3BzIHx8IHt9XG4gICk7XG4gIChnZXRXaW5kb3coKSBhcyBXaW5kb3cpLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KG5hbWUsIGRhdGEpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHByb3BlcnR5IGZyb20gdGhlIHdpbmRvdydzIGRvY3VtZW50IG9iamVjdFxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHNhZmUgd2F5IHRvIGFjY2VzcyBwcm9wZXJ0aWVzIG9uIHRoZSB3aW5kb3cncyBkb2N1bWVudCBvYmplY3QuXG4gKiBJdCB1c2VzIHRoZSBnZXRXaW5kb3dEb2N1bWVudCBmdW5jdGlvbiB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50LCB0aGVuIGFjY2Vzc2VzXG4gKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnJvd3NlciBlbnZpcm9ubWVudCBpbnRlcmFjdGlvbnMgdGhhdCBuZWVkXG4gKiB0byBhY2Nlc3MgZG9jdW1lbnQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlIGZyb20gdGhlIGRvY3VtZW50IG9iamVjdFxuICogQHJldHVybiB7YW55fSBUaGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBkb2N1bWVudCBvciBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0XG4gKlxuICogQGZ1bmN0aW9uIGdldE9uV2luZG93RG9jdW1lbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9uV2luZG93RG9jdW1lbnQoa2V5OiBzdHJpbmcpOiBEb2N1bWVudCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRvYyA9IGdldFdpbmRvd0RvY3VtZW50KCk/LltrZXkgYXMga2V5b2YgRG9jdW1lbnRdO1xuICByZXR1cm4gZG9jIGluc3RhbmNlb2YgRG9jdW1lbnQgP1xuICAgIGRvYyA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBkb2N1bWVudCBvYmplY3QgZnJvbSB0aGUgd2luZG93XG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgc2FmZSB3YXkgdG8gYWNjZXNzIHRoZSBkb2N1bWVudCBvYmplY3QgZnJvbSB0aGUgd2luZG93LlxuICogSXQgdXNlcyB0aGUgZ2V0T25XaW5kb3cgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlICdkb2N1bWVudCcgcHJvcGVydHkgZnJvbSB0aGUgd2luZG93IG9iamVjdC5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBicm93c2VyIGVudmlyb25tZW50IGludGVyYWN0aW9ucyB0aGF0IG5lZWQgYWNjZXNzIHRvIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBAcmV0dXJuIHtEb2N1bWVudCB8IHVuZGVmaW5lZH0gVGhlIHdpbmRvdydzIGRvY3VtZW50IG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0V2luZG93RG9jdW1lbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbmRvd0RvY3VtZW50KCk6IERvY3VtZW50IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldE9uV2luZG93KCdkb2N1bWVudCcpIGFzIERvY3VtZW50O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBwcm9wZXJ0eSBmcm9tIHRoZSB3aW5kb3cgb2JqZWN0XG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgc2FmZSB3YXkgdG8gYWNjZXNzIHByb3BlcnRpZXMgb24gdGhlIHdpbmRvdyBvYmplY3QuXG4gKiBJdCB1c2VzIHRoZSBnZXRXaW5kb3cgZnVuY3Rpb24gdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB3aW5kb3csIHRoZW4gYWNjZXNzZXNcbiAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFRoaXMgaXMgdXNlZnVsIGZvciBicm93c2VyIGVudmlyb25tZW50IGludGVyYWN0aW9ucyB0aGF0IG5lZWRcbiAqIHRvIGFjY2VzcyB3aW5kb3cgcHJvcGVydGllcyBvciBBUElzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0cmlldmUgZnJvbSB0aGUgd2luZG93IG9iamVjdFxuICogQHJldHVybiB7dW5rbm93biB8IHVuZGVmaW5lZH0gVGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHksIG9yIHVuZGVmaW5lZCBpZiB0aGUgd2luZG93IG9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3RcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0T25XaW5kb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9uV2luZG93KGtleTogc3RyaW5nKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRXaW5kb3coKT8uW2tleV07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgYSBwcm9wZXJ0eSBvbiB0aGUgd2luZG93IG9iamVjdFxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHdheSB0byBzZXQgcHJvcGVydGllcyBvbiB0aGUgd2luZG93IG9iamVjdC5cbiAqIEl0IHVzZXMgdGhlIGdldFdpbmRvdyBmdW5jdGlvbiB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHdpbmRvdywgdGhlbiBzZXRzXG4gKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHN0b3JpbmdcbiAqIGdsb2JhbCBkYXRhIG9yIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgYWNjZXNzaWJsZSBhY3Jvc3MgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYXNzaWduIHRvIHRoZSBwcm9wZXJ0eVxuICogQHJldHVybiB7dm9pZH1cbiAqXG4gKiBAZnVuY3Rpb24gc2V0T25XaW5kb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE9uV2luZG93KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBnZXRXaW5kb3coKVtrZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgZ2xvYmFsIHdpbmRvdyBvYmplY3RcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBzYWZlIHdheSB0byBhY2Nlc3MgdGhlIGdsb2JhbCB3aW5kb3cgb2JqZWN0LlxuICogSXQgdXNlcyBnbG9iYWxUaGlzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBkaWZmZXJlbnQgSmF2YVNjcmlwdCBlbnZpcm9ubWVudHMuXG4gKiBUaGlzIGlzIHRoZSBjb3JlIGZ1bmN0aW9uIHVzZWQgYnkgb3RoZXIgd2luZG93LXJlbGF0ZWQgdXRpbGl0eSBmdW5jdGlvbnMgdG9cbiAqIGFjY2VzcyB0aGUgd2luZG93IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIHtXaW5kb3d9IFRoZSBnbG9iYWwgd2luZG93IG9iamVjdFxuICpcbiAqIEBmdW5jdGlvbiBnZXRXaW5kb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbmRvdygpOiBXaW5kb3cgJiBLZXlWYWx1ZSB7XG4gIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBLZXlWYWx1ZSk/Llsnd2luZG93J10gYXMgV2luZG93ICYgS2V5VmFsdWU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgd2lkdGggb2YgdGhlIGJyb3dzZXIgd2luZG93XG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50IHdpZHRoIG9mIHRoZSBicm93c2VyIHdpbmRvdy5cbiAqIEl0IHVzZXMgdGhlIGdldE9uV2luZG93IGZ1bmN0aW9uIHRvIGFjY2VzcyB0aGUgJ2lubmVyV2lkdGgnIHByb3BlcnR5IG9mIHRoZSB3aW5kb3cgb2JqZWN0LlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIHJlc3BvbnNpdmUgZGVzaWduIGltcGxlbWVudGF0aW9ucyBhbmQgdmlld3BvcnQtYmFzZWQgY2FsY3VsYXRpb25zLlxuICpcbiAqIEByZXR1cm4ge251bWJlciB8IHVuZGVmaW5lZH0gVGhlIGN1cnJlbnQgd2lkdGggb2YgdGhlIGJyb3dzZXIgd2luZG93IGluIHBpeGVsc1xuICpcbiAqIEBmdW5jdGlvbiBnZXRXaW5kb3dXaWR0aFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldE9uV2luZG93KCdpbm5lcldpZHRoJykgYXMgbnVtYmVyIHx8IDA7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzICBub3QgdW5kZWZpbmVkXG4gKiBAc3VtbWFyeSBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gdmFsdWUgaXMgbm90IHVuZGVmaW5lZC5cbiAqIEl0J3MgYSBzaW1wbGUgd3JhcHBlciB0aGF0IG1ha2VzIGNvZGUgbW9yZSByZWFkYWJsZSB3aGVuIGNoZWNraW5nIGZvciBkZWZpbmVkIHZhbHVlcy5cbiAqIFRoZSBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBjaGVja2luZyBTdHJpbmdPckJvb2xlYW4gcHJvcGVydGllcyB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ09yQm9vbGVhbiB8IHVuZGVmaW5lZH0gcHJvcCAtIFRoZSBwcm9wZXJ0eSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgbm90IHVuZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQGZ1bmN0aW9uIGlzTm90VW5kZWZpbmVkXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vdFVuZGVmaW5lZChwcm9wOiBTdHJpbmdPckJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChwcm9wICE9PSB1bmRlZmluZWQpIGFzIGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGxvY2FsZSBzdHJpbmcgZnJvbSBhIGNsYXNzIG5hbWUgb3IgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjb252ZXJ0cyBhIGNsYXNzIG5hbWUgb3IgaW5zdGFuY2UgaW50byBhIGxvY2FsZSBzdHJpbmdcbiAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIHB1cnBvc2VzLiBJdCBoYW5kbGVzIGRpZmZlcmVudCBpbnB1dCB0eXBlc1xuICogKHN0cmluZywgZnVuY3Rpb24sIG9yIG9iamVjdCkgYW5kIGFwcGxpZXMgZm9ybWF0dGluZyBydWxlcyB0byBnZW5lcmF0ZSBhIGNvbnNpc3RlbnRcbiAqIGxvY2FsZSBpZGVudGlmaWVyLiBGb3Igc2hvcnQgbmFtZXMgKGxlc3MgdGhhbiAzIHBhcnRzKSwgaXQgcmV2ZXJzZXMgdGhlIGRvdC1zZXBhcmF0ZWRcbiAqIHN0cmluZy4gRm9yIGxvbmdlciBuYW1lcywgaXQgdXNlcyB0aGUgbGFzdCBwYXJ0IGFzIGEgcHJlZml4IGFuZCBqb2lucyB0aGUgcmVzdCB3aXRoXG4gKiB1bmRlcnNjb3Jlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbkxpa2V8b2JqZWN0fSBpbnN0YW5jZSAtIFRoZSBpbnB1dCB0byBnZW5lcmF0ZSB0aGUgbG9jYWxlIGZyb20gKGNsYXNzIG5hbWUsIGNvbnN0cnVjdG9yLCBvciBpbnN0YW5jZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3VmZml4XSAtIE9wdGlvbmFsIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIGluc3RhbmNlIG5hbWUgYmVmb3JlIHByb2Nlc3NpbmdcbiAqIEByZXR1cm4ge3N0cmluZ30gQSBmb3JtYXR0ZWQgbG9jYWxlIHN0cmluZyBkZXJpdmVkIGZyb20gdGhlIGlucHV0XG4gKlxuICogQGZ1bmN0aW9uIGdldExvY2FsZUZyb21DbGFzc05hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsZUZyb21DbGFzc05hbWUoXG4gIGluc3RhbmNlOiBzdHJpbmcgfCBGdW5jdGlvbkxpa2UgfCBLZXlWYWx1ZSxcbiAgc3VmZml4Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGluc3RhbmNlICE9PSBQcmltaXRpdmVzLlNUUklORylcbiAgICBpbnN0YW5jZSA9IChpbnN0YW5jZSBhcyBGdW5jdGlvbkxpa2UpLm5hbWUgfHwgKGluc3RhbmNlIGFzIG9iamVjdCk/LmNvbnN0cnVjdG9yPy5uYW1lO1xuXG4gIGxldCBuYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSA9IGluc3RhbmNlIGFzIHN0cmluZztcblxuICBpZiAoc3VmZml4KVxuICAgIG5hbWUgPSBgJHtpbnN0YW5jZX0ke3N1ZmZpeC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN1ZmZpeC5zbGljZSgxKX1gO1xuXG4gIG5hbWUgPSBuYW1lLnJlcGxhY2UoL198LS9nLCAnJykucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChpbmRleCA+IDEpIHdvcmQgPSAnLicgKyB3b3JkO1xuICAgICAgcmV0dXJuIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KS5zcGxpdCgnLicpO1xuXG4gIGlmIChuYW1lLmxlbmd0aCA8IDMpXG4gICAgcmV0dXJuIG5hbWUucmV2ZXJzZSgpLmpvaW4oJy4nKTtcblxuICBjb25zdCBwcmVmZml4ID0gbmFtZVtuYW1lLmxlbmd0aCAtIDFdO1xuICBuYW1lLnBvcCgpO1xuICBuYW1lID0gbmFtZS5qb2luKCdfJyk7XG4gIHJldHVybiBgJHtwcmVmZml4fS4ke25hbWV9YDtcbn1cblxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudCBsb2NhbGUgbGFuZ3VhZ2VcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBnZXRzIHRoZSBjdXJyZW50IGxvY2FsZSBsYW5ndWFnZSBiYXNlZCBvbiB0aGUgdXNlcidzIGJyb3dzZXIgc2V0dGluZ3MuXG4gKiBJdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgd2F5IHRvIGFjY2VzcyB0aGUgdXNlcidzIGxhbmd1YWdlIHByZWZlcmVuY2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgYnJvd3NlcidzIG5hdmlnYXRvci5sYW5ndWFnZSB2YWx1ZSwgZGVmYXVsdGluZyB0byAnZW4nIGlmIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY3VycmVudCBsb2NhbGUgbGFuZ3VhZ2UgKGUuZy4sICdlbicsICdmcicpXG4gKlxuICogQGZ1bmN0aW9uIGdldExvY2FsZUxhbmd1YWdlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbGVMYW5ndWFnZSgpOiBzdHJpbmcge1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coKTtcbiAgcmV0dXJuICh3aW4gYXMgV2luZG93KS5uYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgXCJlblwiO1xuICAvLyByZXR1cm4gd2luPy5bV0lORE9XX0tFWVMuTEFOR1VBR0VfU0VMRUNURURdIHx8ICh3aW4ubmF2aWdhdG9yLmxhbmd1YWdlIHx8ICcnKS5zcGxpdCgnLScpWzBdIHx8IFwiZW5cIjtcbn1cblxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHJhbmRvbSBzdHJpbmcgb3IgbnVtYmVyIG9mIHNwZWNpZmllZCBsZW5ndGhcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjcmVhdGVzIGEgcmFuZG9tIHN0cmluZyBvZiBhIHNwZWNpZmllZCBsZW5ndGguXG4gKiBJdCBjYW4gZ2VuZXJhdGUgZWl0aGVyIGFscGhhbnVtZXJpYyBzdHJpbmdzIChpbmNsdWRpbmcgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycylcbiAqIG9yIG51bWVyaWMtb25seSBzdHJpbmdzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcmFuZG9tIElEcywgdGVtcG9yYXJ5IHBhc3N3b3JkcyxcbiAqIG9yIG90aGVyIHJhbmRvbSBpZGVudGlmaWVycyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD04XSAtIFRoZSBsZW5ndGggb2YgdGhlIHJhbmRvbSB2YWx1ZSB0byBnZW5lcmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbb25seU51bWJlcnM9ZmFsc2VdIC0gV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IG51bWVyaWMgY2hhcmFjdGVyc1xuICogQHJldHVybiB7c3RyaW5nfSBBIHJhbmRvbWx5IGdlbmVyYXRlZCBzdHJpbmcgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggYW5kIGNoYXJhY3RlciBzZXRcbiAqXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21WYWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21WYWx1ZShsZW5ndGg6IG51bWJlciA9IDgsIG9ubHlOdW1iZXJzOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICBjb25zdCBjaGFycyA9IG9ubHlOdW1iZXJzXG4gICAgPyAnMDEyMzQ1Njc4OSdcbiAgICA6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICByZXN1bHQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGJvb2xlYW4gb3IgYSBib29sZWFuIHZhbHVlIHRvIGEgYm9vbGVhbiB0eXBlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7KCd0cnVlJyB8ICdmYWxzZScgfCBib29sZWFuKX0gcHJvcCAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBDYW4gYmUgdGhlIHN0cmluZyAndHJ1ZScsICdmYWxzZScsIG9yIGEgYm9vbGVhbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgYm9vbGVhbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgdmFsdWUuIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgdGhlIHN0cmluZyAndHJ1ZScgb3IgYm9vbGVhbiB0cnVlLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0Jvb2xlYW4ocHJvcDogJ3RydWUnIHwgJ2ZhbHNlJyB8IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgaWYodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKVxuICAgIHByb3AgPSBwcm9wLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTtcbiAgcmV0dXJuIHByb3A7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgRGF0ZSB8IG51bWJlcil9IGRhdGUgLSBUaGUgdmFsdWUgdG8gY2hlY2suIENhbiBiZSBhIERhdGUgb2JqZWN0LCBhIHRpbWVzdGFtcCBudW1iZXIsIG9yIGEgZGF0ZSBzdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdCAobm90IE5hTiksIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKGRhdGUgYXMgdW5rbm93biBhcyBudW1iZXIpKSB8fCAoKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdFJlZ2V4ID0gbmV3IFJlZ0V4cCgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8pLnRlc3QoZGF0ZSBhcyBzdHJpbmcpXG4gICAgICBpZih0eXBlb2YgZGF0ZSAhPT0gUHJpbWl0aXZlcy5TVFJJTkcgfHwgIShkYXRlIGFzIHN0cmluZyk/LmluY2x1ZGVzKCdUJykgJiYgIXRlc3RSZWdleClcbiAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICBkYXRlID0gKGRhdGUgYXMgc3RyaW5nKS5zcGxpdCgnVCcpWzBdO1xuICAgIGlmKCFuZXcgUmVnRXhwKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLykudGVzdChkYXRlKSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiAhIShuZXcgRGF0ZShkYXRlKSk7XG4gICB9KSgpO1xuICB9IGNhdGNoKGVycm9yOiB1bmtub3duKSB7XG4gICAgZ2V0TG9nZ2VyKGlzVmFsaWREYXRlKS5lcnJvcihlcnJvciBhcyBFcnJvciB8IHN0cmluZyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIGRhdGUgaW50byBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0geyhzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKX0gZGF0ZSAtIFRoZSBkYXRlIHRvIGZvcm1hdC4gQ2FuIGJlIGEgRGF0ZSBvYmplY3QsIGEgdGltZXN0YW1wIG51bWJlciwgb3IgYSBkYXRlIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtsb2NhbGVdIC0gVGhlIGxvY2FsZSB0byB1c2UgZm9yIGZvcm1hdHRpbmcuIElmIG5vdCBwcm92aWRlZCwgdGhlIHN5c3RlbSdzIGxvY2FsZSB3aWxsIGJlIHVzZWRcbiAqIEByZXR1cm4geyhEYXRlIHwgc3RyaW5nKX0gQSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBERC9NTS9ZWVlZIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGxvY2FsZSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIG9yaWdpbmFsIGlucHV0IGFzIGEgc3RyaW5nIGlmIHRoZSBkYXRlIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlciwgbG9jYWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogRGF0ZSB8IHN0cmluZyB7XG5cbiAgaWYoIWxvY2FsZSlcbiAgICBsb2NhbGUgPSBnZXRMb2NhbGVMYW5ndWFnZSgpO1xuXG4gIGlmKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicpXG4gICAgZGF0ZSA9IG5ldyBEYXRlKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJyA/IGRhdGUucmVwbGFjZSgvXFwvL2csICctJykgOiBkYXRlKTtcblxuICBpZighaXNWYWxpZERhdGUoZGF0ZSkpXG4gICAgcmV0dXJuIGAke2RhdGV9YCBhcyBzdHJpbmc7XG4gIGNvbnN0IHIgPSBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwge1xuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgbW9udGg6ICcyLWRpZ2l0J1xuICB9KTtcblxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIHBhcnNlIGEgZGF0ZSBzdHJpbmcsIERhdGUgb2JqZWN0LCBvciBudW1iZXIgaW50byBhIHZhbGlkIERhdGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgRGF0ZSB8IG51bWJlcil9IGRhdGUgLSBUaGUgZGF0ZSB0byBwYXJzZS4gQ2FuIGJlIGEgRGF0ZSBvYmplY3QsIGEgdGltZXN0YW1wIG51bWJlcixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIGRhdGUgc3RyaW5nIGluIHRoZSBmb3JtYXQgXCJERC9NTS9ZWVlZIEhIOk1NOlNTOk1TXCJcbiAqIEByZXR1cm4geyhEYXRlIHwgbnVsbCl9IEEgdmFsaWQgRGF0ZSBvYmplY3QgaWYgcGFyc2luZyBpcyBzdWNjZXNzZnVsLCBvciBudWxsIGlmIHRoZSBkYXRlIGlzIGludmFsaWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb1ZhbGlkRGF0ZShkYXRlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKTogRGF0ZSB8IG51bGwge1xuICBpZihpc1ZhbGlkRGF0ZShkYXRlKSlcbiAgICByZXR1cm4gZGF0ZSBhcyBEYXRlO1xuXG4gIGlmKCFgJHtkYXRlfWAuaW5jbHVkZXMoJy8nKSlcbiAgICByZXR1cm4gbnVsbDtcblxuICBjb25zdCBbZGF0ZVN0cmluZywgdGltZVN0cmluZ10gPSAoZGF0ZSBhcyBzdHJpbmcpLnNwbGl0KCcgJyk7XG4gIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGRhdGVTdHJpbmcuc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgY29uc3QgW2hvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHNdID0gdGltZVN0cmluZy5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xuICBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHMpO1xuXG4gIGlmKCFpc1ZhbGlkRGF0ZShkYXRlKSkge1xuICAgIGNvbnNvbGUud2FybigncGFyc2VUb1ZhbGlkRGF0ZSAtIEludmFsaWQgZGF0ZSBmb3JtYXQnLCBkYXRlKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBkYXRlO1xufVxuXG5cbi8qKlxuICogTWFwcyBhbiBpdGVtIG9iamVjdCB1c2luZyBhIHByb3ZpZGVkIG1hcHBlciBvYmplY3QgYW5kIG9wdGlvbmFsIGFkZGl0aW9uYWwgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBpdGVtIC0gVGhlIHNvdXJjZSBvYmplY3QgdG8gYmUgbWFwcGVkLlxuICogQHBhcmFtIHtLZXlWYWx1ZX0gbWFwcGVyIC0gQW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgbWFwcGluZyBydWxlcy4gS2V5cyByZXByZXNlbnQgdGhlIG5ldyBwcm9wZXJ0eSBuYW1lcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7S2V5VmFsdWV9IFtwcm9wc10gLSBPcHRpb25hbCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG1hcHBlZCBvYmplY3QuXG4gKiBAcmV0dXJucyB7S2V5VmFsdWV9IEEgbmV3IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbWFwcGVkIGFjY29yZGluZyB0byB0aGUgbWFwcGVyIG9iamVjdCBhbmQgaW5jbHVkaW5nIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtTWFwcGVyKGl0ZW06IEtleVZhbHVlLCBtYXBwZXI6IEtleVZhbHVlLCBwcm9wcz86IEtleVZhbHVlKTogS2V5VmFsdWUge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFwcGVyKS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgYXJyYXlWYWx1ZSA9ICh2YWx1ZSBhcyBzdHJpbmcpLnNwbGl0KCcuJyk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJyYXlWYWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgYWNjdW1ba2V5XSA9IGl0ZW0/Llt2YWx1ZSBhcyBzdHJpbmddIHx8ICh2YWx1ZSAhPT0ga2V5ID8gdmFsdWUgOiBcIlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWw7XG5cbiAgICAgICAgZm9yIChjb25zdCBfdmFsdWUgb2YgYXJyYXlWYWx1ZSlcbiAgICAgICAgICB2YWwgPSAhdmFsXG4gICAgICAgICAgICA/IGl0ZW1bX3ZhbHVlXVxuICAgICAgICAgICAgOiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHZhbCkgOiB2YWwpW192YWx1ZV07XG5cbiAgICAgICAgaWYgKGlzVmFsaWREYXRlKG5ldyBEYXRlKHZhbCkpKSB2YWwgPSBgJHtmb3JtYXREYXRlKHZhbCl9YDtcblxuICAgICAgICBhY2N1bVtrZXldID0gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB2YWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyB8fCB7fSwgYWNjdW0pO1xuICB9LCB7fSk7XG59XG5cbi8qKlxuICogTWFwcyBhbiBhcnJheSBvZiBkYXRhIG9iamVjdHMgdXNpbmcgYSBwcm92aWRlZCBtYXBwZXIgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdGluZyBtYXBwZWQgaXRlbXMuXG4gKiBAcGFyYW0ge2FueVtdfSBkYXRhIC0gVGhlIGFycmF5IG9mIGRhdGEgb2JqZWN0cyB0byBiZSBtYXBwZWQuXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBtYXBwZXIgLSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtYXBwaW5nIHJ1bGVzLlxuICogQHBhcmFtIHtLZXlWYWx1ZX0gW3Byb3BzXSAtIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbWFwcGVkIGl0ZW1zLlxuICpcbiAqIEByZXR1cm5zIHtUW119IC0gVGhlIGFycmF5IG9mIG1hcHBlZCBpdGVtcy4gSWYgYW4gaXRlbSBpbiB0aGUgb3JpZ2luYWwgYXJyYXkgZG9lcyBub3QgaGF2ZSBhbnkgbm9uLW51bGwgdmFsdWVzIGFmdGVyIG1hcHBpbmcsXG4gKiB0aGUgb3JpZ2luYWwgaXRlbSBpcyByZXR1cm5lZCBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YU1hcHBlcjxUPihkYXRhOiBUW10sIG1hcHBlcjogS2V5VmFsdWUsIHByb3BzPzogS2V5VmFsdWUpOiBUW10ge1xuICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSByZXR1cm4gW107XG4gIHJldHVybiBkYXRhLnJlZHVjZSgoYWNjdW06IFRbXSwgY3VycikgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSBpdGVtTWFwcGVyKGN1cnIgYXMgS2V5VmFsdWUsIG1hcHBlciwgcHJvcHMpIGFzIFQ7XG4gICAgY29uc3QgaGFzVmFsdWVzID1cbiAgICAgIFsuLi5uZXcgU2V0KE9iamVjdC52YWx1ZXMoaXRlbSBhcyBUW10pKV0uZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUpLmxlbmd0aCA+XG4gICAgICAwO1xuICAgIGFjY3VtLnB1c2goaGFzVmFsdWVzID8gaXRlbSA6IGN1cnIpO1xuICAgIHJldHVybiBhY2N1bTtcbiAgfSwgW10pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGZvY3VzIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgRE9NIGVsZW1lbnRcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBibHVycyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQsXG4gKiBlZmZlY3RpdmVseSByZW1vdmluZyBmb2N1cyB0cmFwcyB0aGF0IG1pZ2h0IHByZXZlbnQgcHJvcGVyIG5hdmlnYXRpb24gb3Iga2V5Ym9hcmRcbiAqIGludGVyYWN0aW9uLiBJdCBzYWZlbHkgYWNjZXNzZXMgdGhlIGRvY3VtZW50J3MgYWN0aXZlRWxlbWVudCBhbmQgY2FsbHMgYmx1cigpIGlmXG4gKiBhbiBlbGVtZW50IGlzIGN1cnJlbnRseSBmb2N1c2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYWNjZXNzaWJpbGl0eSBhbmQgdXNlciBleHBlcmllbmNlXG4gKiBpbXByb3ZlbWVudHMsIHBhcnRpY3VsYXJseSB3aGVuIGNsb3NpbmcgbW9kYWxzIG9yIGRpYWxvZ3MuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqXG4gKiBAZnVuY3Rpb24gcmVtb3ZlRm9jdXNUcmFwXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGb2N1c1RyYXAoKTogdm9pZCB7XG4gIGNvbnN0IGRvYyA9IGdldFdpbmRvd0RvY3VtZW50KCk7XG4gIGlmKGRvYz8uYWN0aXZlRWxlbWVudClcbiAgICAoZG9jLmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpPy5ibHVyKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENsZWFucyBhbmQgbm9ybWFsaXplcyB3aGl0ZXNwYWNlIGluIGEgc3RyaW5nIHZhbHVlXG4gKiBAc3VtbWFyeSBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gdHJpbXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGEgc3RyaW5nXG4gKiBhbmQgcmVwbGFjZXMgbXVsdGlwbGUgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuXG4gKiBPcHRpb25hbGx5IGNvbnZlcnRzIHRoZSByZXN1bHQgdG8gbG93ZXJjYXNlIGZvciBjb25zaXN0ZW50IHRleHQgcHJvY2Vzc2luZy5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBub3JtYWxpemluZyB1c2VyIGlucHV0LCBzZWFyY2ggdGVybXMsIG9yIGRhdGEgc2FuaXRpemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgdmFsdWUgdG8gY2xlYW4gYW5kIG5vcm1hbGl6ZVxuICogQHBhcmFtIHtib29sZWFufSBbbG93ZXJjYXNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gY29udmVydCB0aGUgcmVzdWx0IHRvIGxvd2VyY2FzZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2xlYW5lZCBhbmQgbm9ybWFsaXplZCBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gY2xlYW5TcGFjZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU3BhY2VzKHZhbHVlOiBzdHJpbmcgPSBcIlwiLCBsb3dlcmNhc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gIHZhbHVlID0gYCR7dmFsdWV9YC50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICByZXR1cm4gbG93ZXJjYXNlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xufVxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIHVzZXIncyBzeXN0ZW0gaXMgY3VycmVudGx5IGluIGRhcmsgbW9kZVxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIHVzZXIncyBjb2xvciBzY2hlbWUgcHJlZmVyZW5jZSB1c2luZyB0aGUgQ1NTIG1lZGlhIHF1ZXJ5XG4gKiAnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScuIEl0IHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3lzdGVtIGlzXG4gKiBjdXJyZW50bHkgc2V0IHRvIGRhcmsgbW9kZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyB0aGVtZS1hd2FyZSBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgYWRqdXN0aW5nIFVJIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGNvbG9yIHNjaGVtZS5cbiAqXG4gKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBUcnVlIGlmIHRoZSBzeXN0ZW0gaXMgaW4gZGFyayBtb2RlLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAZnVuY3Rpb24gaXNEYXJrTW9kZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNEYXJrTW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qge21hdGNoZXN9ID0gZ2V0V2luZG93KCkubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpO1xuICByZXR1cm4gbWF0Y2hlcztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
|
2
|
+
import { forkJoin } from 'rxjs';
|
|
3
|
+
import { map } from 'rxjs/operators';
|
|
4
|
+
import { inject, InjectionToken } from '@angular/core';
|
|
5
|
+
import { cleanSpaces, getLocaleFromClassName } from '../helpers';
|
|
6
|
+
export class I18nLoader {
|
|
7
|
+
static loadFromHttp(http) {
|
|
8
|
+
function getSuffix() {
|
|
9
|
+
const today = new Date();
|
|
10
|
+
return `.json?version=${today.getFullYear()}${today.getMonth()}${today.getDay()}`;
|
|
11
|
+
}
|
|
12
|
+
return new (class extends TranslateHttpLoader {
|
|
13
|
+
getTranslation(lang) {
|
|
14
|
+
const res = super.getTranslation(lang);
|
|
15
|
+
return res;
|
|
16
|
+
}
|
|
17
|
+
})(http, './assets/i18n/', getSuffix());
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function getLocaleContext(clazz, suffix) {
|
|
21
|
+
return getLocaleFromClassName(clazz, suffix);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @description Generates a localized string by combining locale and phrase
|
|
25
|
+
* @summary This utility function creates a properly formatted locale string by combining
|
|
26
|
+
* a locale identifier with a phrase. It handles edge cases such as empty phrases,
|
|
27
|
+
* missing locales, and phrases that already include the locale prefix. This function
|
|
28
|
+
* is useful for ensuring consistent formatting of localized strings throughout the application.
|
|
29
|
+
*
|
|
30
|
+
* @param {string} locale - The locale identifier (e.g., 'en', 'fr')
|
|
31
|
+
* @param {string | undefined} phrase - The phrase to localize
|
|
32
|
+
* @return {string} The formatted locale string, or empty string if phrase is undefined
|
|
33
|
+
*
|
|
34
|
+
* @function generateLocaleFromString
|
|
35
|
+
* @memberOf module:for-angular
|
|
36
|
+
*/
|
|
37
|
+
export function getLocaleContextByKey(locale, phrase) {
|
|
38
|
+
if (!phrase)
|
|
39
|
+
return locale;
|
|
40
|
+
if (!locale || phrase.includes(`${locale}.`))
|
|
41
|
+
return phrase;
|
|
42
|
+
const parts = phrase.split(' ');
|
|
43
|
+
return `${locale}.${cleanSpaces(parts.join('.'), true)}`;
|
|
44
|
+
}
|
|
45
|
+
export const I18N_CONFIG_TOKEN = new InjectionToken('I18N_CONFIG_TOKEN');
|
|
46
|
+
export function I18nLoaderFactory(http) {
|
|
47
|
+
const { resources, versionedSuffix } = inject(I18N_CONFIG_TOKEN, { optional: true }) ?? getI18nLoaderFactoryProviderConfig().useValue;
|
|
48
|
+
return new MultiI18nLoader(http, resources, versionedSuffix);
|
|
49
|
+
}
|
|
50
|
+
export function getI18nLoaderFactoryProviderConfig(resources = [], versionedSuffix = false) {
|
|
51
|
+
if (!Array.isArray(resources))
|
|
52
|
+
resources = [resources];
|
|
53
|
+
return {
|
|
54
|
+
provide: I18N_CONFIG_TOKEN,
|
|
55
|
+
useValue: { resources: [
|
|
56
|
+
{ prefix: './assets/i18n/', suffix: '.json' },
|
|
57
|
+
...resources
|
|
58
|
+
], versionedSuffix }
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export class MultiI18nLoader {
|
|
62
|
+
constructor(http, resources = [], versionedSuffix = false) {
|
|
63
|
+
this.http = http;
|
|
64
|
+
this.resources = resources;
|
|
65
|
+
this.versionedSuffix = versionedSuffix;
|
|
66
|
+
}
|
|
67
|
+
getSuffix(suffix) {
|
|
68
|
+
if (!this.versionedSuffix)
|
|
69
|
+
return suffix;
|
|
70
|
+
const today = new Date();
|
|
71
|
+
return `${suffix}?version=${today.getFullYear()}${today.getMonth()}${today.getDay()}`;
|
|
72
|
+
}
|
|
73
|
+
getTranslation(lang) {
|
|
74
|
+
const requests = this.resources.map(config => this.http.get(`${config.prefix}${lang}${this.getSuffix(config.suffix)}`));
|
|
75
|
+
return forkJoin(requests).pipe(map(responseArray => {
|
|
76
|
+
return responseArray.reduce((acc, current) => {
|
|
77
|
+
return { ...acc, ...current };
|
|
78
|
+
}, {});
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pMThuL0xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pFLE1BQU0sT0FBTyxVQUFVO0lBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBZ0I7UUFDbEMsU0FBUyxTQUFTO1lBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekIsT0FBTyxpQkFBaUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQVksQ0FBQztRQUM5RixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLG1CQUFtQjtZQUNsQyxjQUFjLENBQUMsSUFBWTtnQkFDbEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkMsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDO1NBQ0YsQ0FBQyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQUdELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFxQyxFQUFFLE1BQWU7SUFDckYsT0FBTyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7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QUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTG9hZGVyLCBUcmFuc2xhdGlvbk9iamVjdCB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlSHR0cExvYWRlciB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2h0dHAtbG9hZGVyJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0kxOG5SZXNvdXJjZUNvbmZpZ30gZnJvbSAnLi4vZW5naW5lL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnVuY3Rpb25MaWtlIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGNsZWFuU3BhY2VzLCBnZXRMb2NhbGVGcm9tQ2xhc3NOYW1lIH0gZnJvbSAnLi4vaGVscGVycyc7XG5leHBvcnQgY2xhc3MgSTE4bkxvYWRlciB7XG4gIHN0YXRpYyBsb2FkRnJvbUh0dHAoaHR0cDogSHR0cENsaWVudCk6IFRyYW5zbGF0ZUxvYWRlciB7XG4gICAgZnVuY3Rpb24gZ2V0U3VmZml4KCkge1xuICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgcmV0dXJuIGAuanNvbj92ZXJzaW9uPSR7dG9kYXkuZ2V0RnVsbFllYXIoKX0ke3RvZGF5LmdldE1vbnRoKCl9JHt0b2RheS5nZXREYXkoKX1gIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIFRyYW5zbGF0ZUh0dHBMb2FkZXIge1xuICAgICAgb3ZlcnJpZGUgZ2V0VHJhbnNsYXRpb24obGFuZzogc3RyaW5nKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbk9iamVjdD4ge1xuICAgICAgICBjb25zdCByZXMgPSBzdXBlci5nZXRUcmFuc2xhdGlvbihsYW5nKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9KShodHRwLCAnLi9hc3NldHMvaTE4bi8nLCBnZXRTdWZmaXgoKSk7XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxlQ29udGV4dChjbGF6ejogRnVuY3Rpb25MaWtlIHwgb2JqZWN0IHwgc3RyaW5nLCBzdWZmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TG9jYWxlRnJvbUNsYXNzTmFtZShjbGF6eiwgc3VmZml4KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbG9jYWxpemVkIHN0cmluZyBieSBjb21iaW5pbmcgbG9jYWxlIGFuZCBwaHJhc2VcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjcmVhdGVzIGEgcHJvcGVybHkgZm9ybWF0dGVkIGxvY2FsZSBzdHJpbmcgYnkgY29tYmluaW5nXG4gKiBhIGxvY2FsZSBpZGVudGlmaWVyIHdpdGggYSBwaHJhc2UuIEl0IGhhbmRsZXMgZWRnZSBjYXNlcyBzdWNoIGFzIGVtcHR5IHBocmFzZXMsXG4gKiBtaXNzaW5nIGxvY2FsZXMsIGFuZCBwaHJhc2VzIHRoYXQgYWxyZWFkeSBpbmNsdWRlIHRoZSBsb2NhbGUgcHJlZml4LiBUaGlzIGZ1bmN0aW9uXG4gKiBpcyB1c2VmdWwgZm9yIGVuc3VyaW5nIGNvbnNpc3RlbnQgZm9ybWF0dGluZyBvZiBsb2NhbGl6ZWQgc3RyaW5ncyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlIC0gVGhlIGxvY2FsZSBpZGVudGlmaWVyIChlLmcuLCAnZW4nLCAnZnInKVxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHBocmFzZSAtIFRoZSBwaHJhc2UgdG8gbG9jYWxpemVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBsb2NhbGUgc3RyaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgcGhyYXNlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUxvY2FsZUZyb21TdHJpbmdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsZUNvbnRleHRCeUtleShcbiAgbG9jYWxlOiBzdHJpbmcsXG4gIHBocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcge1xuICBpZiAoIXBocmFzZSlcbiAgICByZXR1cm4gbG9jYWxlO1xuICBpZiAoIWxvY2FsZSB8fCBwaHJhc2UuaW5jbHVkZXMoYCR7bG9jYWxlfS5gKSlcbiAgICByZXR1cm4gcGhyYXNlO1xuICBjb25zdCBwYXJ0cyA9IHBocmFzZS5zcGxpdCgnICcpO1xuICByZXR1cm4gYCR7bG9jYWxlfS4ke2NsZWFuU3BhY2VzKHBhcnRzLmpvaW4oJy4nKSwgdHJ1ZSl9YDtcbn1cblxuZXhwb3J0IGNvbnN0IEkxOE5fQ09ORklHX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPHtyZXNvdXJjZXM6IEkxOG5SZXNvdXJjZUNvbmZpZ1tdOyB2ZXJzaW9uZWRTdWZmaXg6IGZhbHNlfT4oJ0kxOE5fQ09ORklHX1RPS0VOJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBJMThuTG9hZGVyRmFjdG9yeShodHRwOiBIdHRwQ2xpZW50KTogVHJhbnNsYXRlTG9hZGVyIHtcbiAgY29uc3Qge3Jlc291cmNlcywgdmVyc2lvbmVkU3VmZml4fSA9IGluamVjdChJMThOX0NPTkZJR19UT0tFTiwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBnZXRJMThuTG9hZGVyRmFjdG9yeVByb3ZpZGVyQ29uZmlnKCkudXNlVmFsdWU7XG4gIHJldHVybiBuZXcgTXVsdGlJMThuTG9hZGVyKGh0dHAsIHJlc291cmNlcywgdmVyc2lvbmVkU3VmZml4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEkxOG5Mb2FkZXJGYWN0b3J5UHJvdmlkZXJDb25maWcocmVzb3VyY2VzOiBJMThuUmVzb3VyY2VDb25maWcgfCBJMThuUmVzb3VyY2VDb25maWdbXSA9IFtdLCB2ZXJzaW9uZWRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZSkge1xuICBpZighQXJyYXkuaXNBcnJheShyZXNvdXJjZXMpKVxuICAgIHJlc291cmNlcyA9IFtyZXNvdXJjZXNdO1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IEkxOE5fQ09ORklHX1RPS0VOLFxuICAgIHVzZVZhbHVlOiB7IHJlc291cmNlczogW1xuICAgICAgeyBwcmVmaXg6ICcuL2Fzc2V0cy9pMThuLycsIHN1ZmZpeDogJy5qc29uJyB9LFxuICAgICAgLi4ucmVzb3VyY2VzXG4gICAgXSwgdmVyc2lvbmVkU3VmZml4fVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUkxOG5Mb2FkZXIgaW1wbGVtZW50cyBJMThuTG9hZGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIHJlc291cmNlczogSTE4blJlc291cmNlQ29uZmlnW10gPSBbXSwgcHJpdmF0ZSB2ZXJzaW9uZWRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZSkge31cblxuICBwcml2YXRlIGdldFN1ZmZpeChzdWZmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYoIXRoaXMudmVyc2lvbmVkU3VmZml4KVxuICAgICAgcmV0dXJuIHN1ZmZpeDtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGAke3N1ZmZpeH0/dmVyc2lvbj0ke3RvZGF5LmdldEZ1bGxZZWFyKCl9JHt0b2RheS5nZXRNb250aCgpfSR7dG9kYXkuZ2V0RGF5KCl9YCBhcyBzdHJpbmc7XG4gIH1cblxuICBnZXRUcmFuc2xhdGlvbihsYW5nOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9uT2JqZWN0PiB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSB0aGlzLnJlc291cmNlcy5tYXAoY29uZmlnID0+XG4gICAgICB0aGlzLmh0dHAuZ2V0KGAke2NvbmZpZy5wcmVmaXh9JHtsYW5nfSR7dGhpcy5nZXRTdWZmaXgoY29uZmlnLnN1ZmZpeCl9YClcbiAgICApO1xuXG4gICAgcmV0dXJuIGZvcmtKb2luKHJlcXVlc3RzKS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlQXJyYXkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VBcnJheS5yZWR1Y2UoKGFjYywgY3VycmVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgLi4uY3VycmVudCB9O1xuICAgICAgICB9LCB7fSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|