@draggable/i18n 1.1.2 → 1.2.1

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.
@@ -0,0 +1,131 @@
1
+ /** A language: translation keys mapped to strings */
2
+ export type LanguageStrings = Record<string, string>
3
+
4
+ /** Languages keyed by locale, eg. `{ 'en-US': { hello: 'Hello' } }` */
5
+ export type Languages = Record<string, LanguageStrings>
6
+
7
+ /** Arguments for placeholder substitution: an object of named values or a single primitive for every token */
8
+ export type I18NArgs = Record<string, unknown> | string | number | boolean | null | undefined
9
+
10
+ /** Passed to `onMissing` when a key or a placeholder argument is missing */
11
+ export interface MissingInfo {
12
+ /** translation key that was requested */
13
+ key: string
14
+ /** locale that was requested */
15
+ locale: string
16
+ /** `'key'` when the translation is missing, `'arg'` when a placeholder has no value */
17
+ type: 'key' | 'arg'
18
+ /** placeholder name, only set when `type` is `'arg'` */
19
+ arg?: string
20
+ }
21
+
22
+ /** Return a string to use it in place of the missing key or argument */
23
+ export type OnMissingHandler = (info: MissingInfo) => string | void
24
+
25
+ export interface I18NOptions {
26
+ /** extension of remote language files, default `'.lang'` */
27
+ extension?: string
28
+ /** local or remote directory containing language files, default `'assets/lang/'` */
29
+ location?: string
30
+ /** list of available locales, default `['en-US']` */
31
+ langs?: string[]
32
+ /** initial locale, defaults to the first of `langs` when falsy, default `'en-US'` */
33
+ locale?: string | null
34
+ /** languages available without fetching */
35
+ preloaded?: Languages
36
+ /** keys that take precedence over loaded and preloaded languages */
37
+ override?: Languages
38
+ /**
39
+ * Locale(s) to fall back to when a key is missing. Lookup order: requested locale,
40
+ * its base language if loaded (`pt-BR` → `pt`), then each fallback locale.
41
+ * When set, empty string values count as present.
42
+ */
43
+ fallbackLocale?: string | string[]
44
+ /** called for missing keys (in `get`/`t`) and missing placeholder arguments */
45
+ onMissing?: OnMissingHandler
46
+ }
47
+
48
+ export interface I18NConfig extends I18NOptions {
49
+ extension: string
50
+ location: string
51
+ langs: string[]
52
+ override: Languages
53
+ }
54
+
55
+ export type TranslateFunction = (key: string, args?: I18NArgs) => string
56
+
57
+ export interface I18NInstance {
58
+ config: I18NConfig
59
+ /** loaded languages keyed by locale */
60
+ langs: Languages
61
+ /** locales that have been loaded */
62
+ loaded: string[]
63
+ /** current locale */
64
+ locale: string
65
+ /** current language, set by `setCurrent()` / `init()` */
66
+ current?: LanguageStrings
67
+ /** available locales */
68
+ readonly getLangs: string[]
69
+
70
+ /** parse and apply options, does not fetch */
71
+ processConfig(options?: I18NOptions): void
72
+ /** apply options and load the current (and fallback) locale */
73
+ init(options?: I18NOptions): Promise<LanguageStrings>
74
+ /** add a language from an object or `.lang` file contents */
75
+ addLanguage(locale: string, lang?: LanguageStrings | string): void
76
+ /** merge a language (and its overrides) into the loaded languages */
77
+ applyLanguage(locale: string, lang?: LanguageStrings): LanguageStrings
78
+ /** fetch a language file, cached unless `useCache` is false */
79
+ loadLang(locale: string, useCache?: boolean): Promise<LanguageStrings>
80
+ /** load a language if needed and make it current */
81
+ setCurrent(locale?: string): Promise<LanguageStrings>
82
+
83
+ /** translated string with placeholders replaced, or undefined when missing */
84
+ get(key: string, args?: I18NArgs, locale?: string): string | undefined
85
+ /** translated string with placeholders replaced, falls back to the key */
86
+ t(key: string, args?: I18NArgs, locale?: string): string
87
+ /** `t` bound to a locale */
88
+ forLocale(locale: string): TranslateFunction
89
+ /** raw string for a key, without placeholder replacement or plurals */
90
+ getValue(key: string, locale?: string): string | undefined
91
+ /** first loaded language containing the key */
92
+ getFallbackValue(key: string): string | undefined
93
+ /** plural form of a key (`key.zero`, `key.one`, `key.other`, ...) */
94
+ getPluralValue(key: string, count: number, locale?: string): string | undefined
95
+ /** configured fallback locales */
96
+ getFallbackLocales(): string[]
97
+ /** locales checked in order when `fallbackLocale` is configured */
98
+ getLocaleChain(locale?: string): string[]
99
+ /** set a string in the current language or the given locale */
100
+ put(key: string, string: string, locale?: string): string
101
+ /** RegExp matching a placeholder token literally */
102
+ makeSafe(str: string): RegExp
103
+ /** invoke `onMissing`, returns its string result */
104
+ handleMissing(info: MissingInfo): string | undefined
105
+ }
106
+
107
+ export interface I18NConstructor {
108
+ /** create a new instance */
109
+ new (options?: I18NOptions): I18NInstance
110
+ /** get the singleton instance, options are only used when it is first created */
111
+ (options?: I18NOptions): I18NInstance
112
+ readonly prototype: I18NInstance
113
+
114
+ /** parse `.lang` file contents */
115
+ processFile(text: string): LanguageStrings
116
+ /** parse `.lang` file contents */
117
+ fromFile(text: string): LanguageStrings
118
+ /** parse `.lang` file contents, alias of `processFile` */
119
+ parse(text: string): LanguageStrings
120
+ /** get the singleton instance, options are only used when it is first created */
121
+ getInstance(options?: I18NOptions): I18NInstance
122
+ /** discard the singleton instance, the default export keeps its reference */
123
+ resetInstance(): void
124
+ }
125
+
126
+ export declare const I18N: I18NConstructor
127
+ export type I18N = I18NInstance
128
+
129
+ /** singleton instance */
130
+ declare const i18n: I18NInstance
131
+ export default i18n
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,131 @@
1
+ /** A language: translation keys mapped to strings */
2
+ export type LanguageStrings = Record<string, string>
3
+
4
+ /** Languages keyed by locale, eg. `{ 'en-US': { hello: 'Hello' } }` */
5
+ export type Languages = Record<string, LanguageStrings>
6
+
7
+ /** Arguments for placeholder substitution: an object of named values or a single primitive for every token */
8
+ export type I18NArgs = Record<string, unknown> | string | number | boolean | null | undefined
9
+
10
+ /** Passed to `onMissing` when a key or a placeholder argument is missing */
11
+ export interface MissingInfo {
12
+ /** translation key that was requested */
13
+ key: string
14
+ /** locale that was requested */
15
+ locale: string
16
+ /** `'key'` when the translation is missing, `'arg'` when a placeholder has no value */
17
+ type: 'key' | 'arg'
18
+ /** placeholder name, only set when `type` is `'arg'` */
19
+ arg?: string
20
+ }
21
+
22
+ /** Return a string to use it in place of the missing key or argument */
23
+ export type OnMissingHandler = (info: MissingInfo) => string | void
24
+
25
+ export interface I18NOptions {
26
+ /** extension of remote language files, default `'.lang'` */
27
+ extension?: string
28
+ /** local or remote directory containing language files, default `'assets/lang/'` */
29
+ location?: string
30
+ /** list of available locales, default `['en-US']` */
31
+ langs?: string[]
32
+ /** initial locale, defaults to the first of `langs` when falsy, default `'en-US'` */
33
+ locale?: string | null
34
+ /** languages available without fetching */
35
+ preloaded?: Languages
36
+ /** keys that take precedence over loaded and preloaded languages */
37
+ override?: Languages
38
+ /**
39
+ * Locale(s) to fall back to when a key is missing. Lookup order: requested locale,
40
+ * its base language if loaded (`pt-BR` → `pt`), then each fallback locale.
41
+ * When set, empty string values count as present.
42
+ */
43
+ fallbackLocale?: string | string[]
44
+ /** called for missing keys (in `get`/`t`) and missing placeholder arguments */
45
+ onMissing?: OnMissingHandler
46
+ }
47
+
48
+ export interface I18NConfig extends I18NOptions {
49
+ extension: string
50
+ location: string
51
+ langs: string[]
52
+ override: Languages
53
+ }
54
+
55
+ export type TranslateFunction = (key: string, args?: I18NArgs) => string
56
+
57
+ export interface I18NInstance {
58
+ config: I18NConfig
59
+ /** loaded languages keyed by locale */
60
+ langs: Languages
61
+ /** locales that have been loaded */
62
+ loaded: string[]
63
+ /** current locale */
64
+ locale: string
65
+ /** current language, set by `setCurrent()` / `init()` */
66
+ current?: LanguageStrings
67
+ /** available locales */
68
+ readonly getLangs: string[]
69
+
70
+ /** parse and apply options, does not fetch */
71
+ processConfig(options?: I18NOptions): void
72
+ /** apply options and load the current (and fallback) locale */
73
+ init(options?: I18NOptions): Promise<LanguageStrings>
74
+ /** add a language from an object or `.lang` file contents */
75
+ addLanguage(locale: string, lang?: LanguageStrings | string): void
76
+ /** merge a language (and its overrides) into the loaded languages */
77
+ applyLanguage(locale: string, lang?: LanguageStrings): LanguageStrings
78
+ /** fetch a language file, cached unless `useCache` is false */
79
+ loadLang(locale: string, useCache?: boolean): Promise<LanguageStrings>
80
+ /** load a language if needed and make it current */
81
+ setCurrent(locale?: string): Promise<LanguageStrings>
82
+
83
+ /** translated string with placeholders replaced, or undefined when missing */
84
+ get(key: string, args?: I18NArgs, locale?: string): string | undefined
85
+ /** translated string with placeholders replaced, falls back to the key */
86
+ t(key: string, args?: I18NArgs, locale?: string): string
87
+ /** `t` bound to a locale */
88
+ forLocale(locale: string): TranslateFunction
89
+ /** raw string for a key, without placeholder replacement or plurals */
90
+ getValue(key: string, locale?: string): string | undefined
91
+ /** first loaded language containing the key */
92
+ getFallbackValue(key: string): string | undefined
93
+ /** plural form of a key (`key.zero`, `key.one`, `key.other`, ...) */
94
+ getPluralValue(key: string, count: number, locale?: string): string | undefined
95
+ /** configured fallback locales */
96
+ getFallbackLocales(): string[]
97
+ /** locales checked in order when `fallbackLocale` is configured */
98
+ getLocaleChain(locale?: string): string[]
99
+ /** set a string in the current language or the given locale */
100
+ put(key: string, string: string, locale?: string): string
101
+ /** RegExp matching a placeholder token literally */
102
+ makeSafe(str: string): RegExp
103
+ /** invoke `onMissing`, returns its string result */
104
+ handleMissing(info: MissingInfo): string | undefined
105
+ }
106
+
107
+ export interface I18NConstructor {
108
+ /** create a new instance */
109
+ new (options?: I18NOptions): I18NInstance
110
+ /** get the singleton instance, options are only used when it is first created */
111
+ (options?: I18NOptions): I18NInstance
112
+ readonly prototype: I18NInstance
113
+
114
+ /** parse `.lang` file contents */
115
+ processFile(text: string): LanguageStrings
116
+ /** parse `.lang` file contents */
117
+ fromFile(text: string): LanguageStrings
118
+ /** parse `.lang` file contents, alias of `processFile` */
119
+ parse(text: string): LanguageStrings
120
+ /** get the singleton instance, options are only used when it is first created */
121
+ getInstance(options?: I18NOptions): I18NInstance
122
+ /** discard the singleton instance, the default export keeps its reference */
123
+ resetInstance(): void
124
+ }
125
+
126
+ export declare const I18N: I18NConstructor
127
+ export type I18N = I18NInstance
128
+
129
+ /** singleton instance */
130
+ declare const i18n: I18NInstance
131
+ export default i18n
@@ -1,9 +1,9 @@
1
1
 
2
2
  /**
3
3
  @draggable/i18n - https://github.com/Draggable/i18n
4
- Version: 1.1.1
4
+ Version: 1.2.0
5
5
  Author: Draggable https://draggable.io
6
6
  */
7
7
 
8
- Object.freeze({method:"GET",body:""});var t={extension:".lang",location:"assets/lang/",langs:["en-US"],locale:"en-US",override:{}},e=null,n=new Proxy(class s{constructor(e=t){this.langs=Object.create(null),this.loaded=[],this.processConfig(e)}processConfig(e){const{location:n,...s}={...t,...e},a=n.endsWith("/")?n:`${n}/`;this.config={location:a,...s};const{preloaded:i={},override:r={}}=this.config,l=/* @__PURE__ */new Set([...Object.keys(i),...Object.keys(r)]);for(const t of l){const e={...i[t]||{},...r[t]||{}};this.applyLanguage(t,e)}this.locale=this.config.locale||this.config.langs[0]}init(t){return this.processConfig({...this.config,...t}),this.setCurrent(this.locale)}addLanguage(t,e={}){e="string"==typeof e?s.processFile(e):e,this.applyLanguage(t,e),this.loaded.push(t),this.config.langs.push(t)}getValue(t,e=this.locale){return this.langs[e]?.[t]||this.getFallbackValue(t)}getFallbackValue(t){return Object.values(this.langs).find(e=>e[t])?.[t]}makeSafe(t){const e={"{":String.raw`\{`,"}":String.raw`\}`,"|":String.raw`\|`},n=t.replaceAll(/[{}|]/g,t=>e[t]);return new RegExp(n,"g")}put(t,e){return this.current[t]=e,e}get(t,e){let n=this.getValue(t);if(!n)return;if(!e)return n;const s=n.match(/\{[^}]+?\}/g);if(!s)return n;if("object"==typeof e)for(const a of s){const t=a.slice(1,-1);n=n.replace(this.makeSafe(a),e[t]??"")}else n=n.replaceAll(/\{[^}]+?\}/g,e);return n}static processFile(t){return n.fromFile(t.replaceAll("\n\n","\n"))}static fromFile(t){const e=t.split("\n"),n={};for(let s,a=0;a<e.length;a++)s=/^(.+?) *?= *?([^\n]+)/.exec(e[a]),s&&(n[s[1]]=s[2].trim());return n}static getInstance(t){return e||(e=new s(t)),e}static resetInstance(){e=null}async loadLang(t,e=!0){if(this.loaded.includes(t)&&e)return this.langs[t];const n=`${this.config.location}${t}${this.config.extension}`;try{const e=await async function(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e[t.endsWith(".lang")?"text":"json"]()}catch(e){throw e}}(n),a=s.processFile(e);return this.applyLanguage(t,a),this.langs[t]}catch(a){return this.applyLanguage(t)}}applyLanguage(t,e={}){const n=this.config.override[t]||{},s=this.langs[t]||{};return this.langs[t]={...s,...e,...n},this.loaded.push(t),this.langs[t]}get getLangs(){return this.config.langs}async setCurrent(t="en-US"){return this.loaded.includes(t)||await this.loadLang(t),this.locale=t,this.current=this.langs[t],this.current}},{apply:(t,e,n)=>t.getInstance(...n),construct:(t,e)=>new t(...e),get:(t,e)=>t[e]}),s=n.getInstance();export{n as I18N,s as default};
9
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5lcy5taW4uanMiLCJuYW1lcyI6WyJPYmplY3QiLCJmcmVlemUiLCJtZXRob2QiLCJib2R5IiwiREVGQVVMVF9DT05GSUciLCJleHRlbnNpb24iLCJsb2NhdGlvbiIsImxhbmdzIiwibG9jYWxlIiwib3ZlcnJpZGUiLCJpbnN0YW5jZSIsIkkxOE4iLCJQcm94eSIsIkkxOE5CYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwidGhpcyIsImNyZWF0ZSIsImxvYWRlZCIsInByb2Nlc3NDb25maWciLCJyZXN0T3B0aW9ucyIsInBhcnNlZExvY2F0aW9uIiwiZW5kc1dpdGgiLCJjb25maWciLCJwcmVsb2FkZWQiLCJhbGxMb2NhbGVzIiwiU2V0Iiwia2V5cyIsIm1lcmdlZExhbmciLCJhcHBseUxhbmd1YWdlIiwiaW5pdCIsInNldEN1cnJlbnQiLCJhZGRMYW5ndWFnZSIsImxhbmciLCJwcm9jZXNzRmlsZSIsInB1c2giLCJnZXRWYWx1ZSIsImtleSIsImdldEZhbGxiYWNrVmFsdWUiLCJ2YWx1ZXMiLCJmaW5kIiwibWFrZVNhZmUiLCJzdHIiLCJtYXBPYmoiLCJTdHJpbmciLCJyYXciLCJlc2NhcGVkU3RyIiwicmVwbGFjZUFsbCIsIm1hdGNoZWQiLCJSZWdFeHAiLCJwdXQiLCJzdHJpbmciLCJjdXJyZW50IiwiZ2V0IiwiYXJncyIsInZhbHVlIiwidG9rZW5zIiwibWF0Y2giLCJ0b2tlbiIsInRva2VuS2V5Iiwic2xpY2UiLCJyZXBsYWNlIiwicmVzcG9uc2UiLCJmcm9tRmlsZSIsInJhd1RleHQiLCJsaW5lcyIsInNwbGl0IiwibWF0Y2hlcyIsImkiLCJsZW5ndGgiLCJleGVjIiwidHJpbSIsImdldEluc3RhbmNlIiwicmVzZXRJbnN0YW5jZSIsImxvYWRMYW5nIiwidXNlQ2FjaGUiLCJpbmNsdWRlcyIsImxhbmdGaWxlIiwiYXN5bmMiLCJ1cmwiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJlcnJvciIsImZldGNoRGF0YSIsInByb2Nlc3NlZEZpbGUiLCJlcnIiLCJleGlzdGluZ0xhbmciLCJnZXRMYW5ncyIsImFwcGx5IiwidGFyZ2V0IiwidGhpc0FyZyIsImNvbnN0cnVjdCIsInByb3AiLCJtaTE4bl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2ZldGNoLmpzIiwiLi4vc3JjL21pMThuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGRlZmF1bHRPcHRpb25zID0gT2JqZWN0LmZyZWV6ZSh7IG1ldGhvZDogJ0dFVCcsIGJvZHk6ICcnIH0pXG4vKipcbiAqIEZldGNoZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBuZXR3b3JrLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGZldGNoLlxuICogQHBhcmFtIHtPYmplY3R9IFtmZXRjaE9wdGlvbnM9e31dIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBmZXRjaCByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtmZXRjaE9wdGlvbnMuaGVhZGVyc10gLSBIZWFkZXJzIHRvIGluY2x1ZGUgaW4gdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZldGNoT3B0aW9ucy5tZXRob2RdIC0gVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSAoZS5nLiwgJ0dFVCcsICdQT1NUJykuXG4gKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IFtmZXRjaE9wdGlvbnMuYm9keV0gLSBUaGUgYm9keSBvZiB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3BvbnNlIG9iamVjdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHJldHVybi5vayAtIEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc3RhdHVzIGlzIGluIHRoZSByYW5nZSAyMDAtMjk5LlxuICogQHJldHVybiB7bnVtYmVyfSByZXR1cm4uc3RhdHVzIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm4uc3RhdHVzVGV4dCAtIFRoZSBIVFRQIHN0YXR1cyBtZXNzYWdlIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge01hcDxzdHJpbmcsIHN0cmluZz59IHJldHVybi5oZWFkZXJzIC0gVGhlIGhlYWRlcnMgb2YgdGhlIHJlc3BvbnNlLlxuICogQHJldHVybiB7QnVmZmVyfSByZXR1cm4uYm9keSAtIFRoZSBib2R5IG9mIHRoZSByZXNwb25zZSBhcyBhIEJ1ZmZlci5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IFByb21pc2U8QnVmZmVyPn0gcmV0dXJuLmFycmF5QnVmZmVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgYm9keSBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IFByb21pc2U8T2JqZWN0Pn0gcmV0dXJuLmpzb24gLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBib2R5IHBhcnNlZCBhcyBKU09OLlxuICovXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEodXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXIgPSB1cmwuZW5kc1dpdGgoJy5sYW5nJykgPyAndGV4dCcgOiAnanNvbidcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2VbaGFuZGxlcl0oKVxuICAgIHJldHVybiBkYXRhXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignVGhlcmUgaGFzIGJlZW4gYSBwcm9ibGVtIHdpdGggeW91ciBmZXRjaCBvcGVyYXRpb246JywgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmV0Y2hEYXRhIH0gZnJvbSAnLi9mZXRjaC5qcydcblxuY29uc3QgREVGQVVMVF9DT05GSUcgPSB7XG4gIGV4dGVuc2lvbjogJy5sYW5nJyxcbiAgLy8gbG9jYWwgb3IgcmVtb3RlIGRpcmVjdG9yeSBjb250YWluaW5nIGxhbmd1YWdlIGZpbGVzXG4gIGxvY2F0aW9uOiAnYXNzZXRzL2xhbmcvJyxcbiAgLy8gbGlzdCBvZiBhdmFpbGFibGUgbG9jYWxlcywgaGFuZHkgZm9yIHBvcHVsYXRpbmcgc2VsZWN0b3IuXG4gIGxhbmdzOiBbJ2VuLVVTJ10sXG4gIGxvY2FsZTogJ2VuLVVTJywgLy8gaW5pdCB3aXRoIHVzZXIncyBwcmVmZXJyZWQgbGFuZ3VhZ2VcbiAgb3ZlcnJpZGU6IHt9LFxufVxuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2UgaG9sZGVyXG5sZXQgaW5zdGFuY2UgPSBudWxsXG5cbi8qKlxuICogTWFpbiBpMThuIGNsYXNzXG4gKiBAY2xhc3MgSTE4TkJhc2VcbiAqIEBjbGFzc2Rlc2MgbWV0aG9kcyBhbmQgZGF0YSBzdG9yZSBmb3IgaTE4blxuICovXG5jbGFzcyBJMThOQmFzZSB7XG4gIC8qKlxuICAgKiBQcm9jZXNzIG9wdGlvbnMgYW5kIHN0YXJ0IHRoZSBtb2R1bGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSBERUZBVUxUX0NPTkZJRykge1xuICAgIHRoaXMubGFuZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5sb2FkZWQgPSBbXVxuICAgIHRoaXMucHJvY2Vzc0NvbmZpZyhvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIHBhcnNlIGFuZCBmb3JtYXQgY29uZmlnXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBwcm9jZXNzQ29uZmlnKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGxvY2F0aW9uLCAuLi5yZXN0T3B0aW9ucyB9ID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4ub3B0aW9ucyB9XG4gICAgLy8gRW5zdXJlIGxvY2F0aW9uIGVuZHMgd2l0aCBhIHNsYXNoXG4gICAgY29uc3QgcGFyc2VkTG9jYXRpb24gPSBsb2NhdGlvbi5lbmRzV2l0aCgnLycpID8gbG9jYXRpb24gOiBgJHtsb2NhdGlvbn0vYFxuICAgIHRoaXMuY29uZmlnID0geyBsb2NhdGlvbjogcGFyc2VkTG9jYXRpb24sIC4uLnJlc3RPcHRpb25zIH1cblxuICAgIGNvbnN0IHsgcHJlbG9hZGVkID0ge30sIG92ZXJyaWRlID0ge30gfSA9IHRoaXMuY29uZmlnXG5cbiAgICAvLyBNZXJnZSBsb2NhbGVzIGZyb20gYm90aCBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlXG4gICAgLy8gVGhpcyBzdXBwb3J0cyBsZWdhY3kgdXNhZ2Ugd2hlcmUgb3ZlcnJpZGUgZGVmaW5lZCBlbnRpcmUgbGFuZ3VhZ2VzXG4gICAgY29uc3QgYWxsTG9jYWxlcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKHByZWxvYWRlZCksIC4uLk9iamVjdC5rZXlzKG92ZXJyaWRlKV0pXG5cbiAgICAvLyBBcHBseSBsYW5ndWFnZXMgZnJvbSBib3RoIHByZWxvYWRlZCBhbmQgb3ZlcnJpZGVcbiAgICAvLyBhcHBseUxhbmd1YWdlIHdpbGwgbWVyZ2UgdGhlbSBwcm9wZXJseSAoZXhpc3RpbmcgKyBwcmVsb2FkZWQgKyBvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBhbGxMb2NhbGVzKSB7XG4gICAgICBjb25zdCBwcmVsb2FkZWRMYW5nID0gcHJlbG9hZGVkW2xvY2FsZV0gfHwge31cbiAgICAgIGNvbnN0IG92ZXJyaWRlTGFuZyA9IG92ZXJyaWRlW2xvY2FsZV0gfHwge31cbiAgICAgIC8vIE1lcmdlIHByZWxvYWRlZCBhbmQgb3ZlcnJpZGUgZm9yIHRoaXMgbG9jYWxlXG4gICAgICBjb25zdCBtZXJnZWRMYW5nID0geyAuLi5wcmVsb2FkZWRMYW5nLCAuLi5vdmVycmlkZUxhbmcgfVxuICAgICAgdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSwgbWVyZ2VkTGFuZylcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuY29uZmlnLmxvY2FsZSB8fCB0aGlzLmNvbmZpZy5sYW5nc1swXVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbGFuZ3VhZ2UgYW5kIHNldCBkZWZhdWx0XG4gICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICAgcmVzb2x2ZXMgbGFuZ3VhZ2VcbiAgICovXG4gIGluaXQob3B0aW9ucykge1xuICAgIHRoaXMucHJvY2Vzc0NvbmZpZyh7IC4uLnRoaXMuY29uZmlnLCAuLi5vcHRpb25zIH0pXG4gICAgcmV0dXJuIHRoaXMuc2V0Q3VycmVudCh0aGlzLmxvY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbGFuZ3VhZ2UgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxhbmd1YWdlc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gbGFuZ1xuICAgKi9cbiAgYWRkTGFuZ3VhZ2UobG9jYWxlLCBsYW5nID0ge30pIHtcbiAgICBsYW5nID0gdHlwZW9mIGxhbmcgPT09ICdzdHJpbmcnID8gSTE4TkJhc2UucHJvY2Vzc0ZpbGUobGFuZykgOiBsYW5nXG4gICAgdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSwgbGFuZylcbiAgICB0aGlzLmxvYWRlZC5wdXNoKGxvY2FsZSlcbiAgICB0aGlzLmNvbmZpZy5sYW5ncy5wdXNoKGxvY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYSBzdHJpbmcgZnJvbSBhIGxvYWRlZCBsYW5ndWFnZSBmaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5ICAtIHRoZSBrZXkgZm9yIHRoZSBzdHJpbmcgd2UgYXJlIHRyeWluZyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZSAtIGxvY2FsZSB0byBjaGVjayBmb3IgdmFsdWVcbiAgICogQHJldHVybiB7U3RyaW5nfSBsYW5ndWFnZSBzdHJpbmcgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRWYWx1ZShrZXksIGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmxhbmdzW2xvY2FsZV0/LltrZXldXG4gICAgcmV0dXJuIHZhbHVlIHx8IHRoaXMuZ2V0RmFsbGJhY2tWYWx1ZShrZXkpXG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIGxhbmd1YWdlIHRoYXQgaGFzIGRlc2lyZWQga2V5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdmFsdWUga2V5XG4gICAqIEByZXR1cm4ge1N0cmluZ30gZm91bmQgdmFsdWUgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRGYWxsYmFja1ZhbHVlKGtleSkge1xuICAgIGNvbnN0IGZhbGxiYWNrTGFuZyA9IE9iamVjdC52YWx1ZXModGhpcy5sYW5ncykuZmluZChsYW5nID0+IGxhbmdba2V5XSlcbiAgICByZXR1cm4gZmFsbGJhY2tMYW5nPy5ba2V5XVxuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZSB2YXJpYWJsZSBzeW50YXhcbiAgICogQHBhcmFtICB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgZXNjYXBlZCBzdHJcbiAgICovXG4gIG1ha2VTYWZlKHN0cikge1xuICAgIGNvbnN0IG1hcE9iaiA9IHtcbiAgICAgICd7JzogU3RyaW5nLnJhd2BcXHtgLFxuICAgICAgJ30nOiBTdHJpbmcucmF3YFxcfWAsXG4gICAgICAnfCc6IFN0cmluZy5yYXdgXFx8YCxcbiAgICB9XG5cbiAgICBjb25zdCBlc2NhcGVkU3RyID0gc3RyLnJlcGxhY2VBbGwoL1t7fXxdL2csIG1hdGNoZWQgPT4gbWFwT2JqW21hdGNoZWRdKVxuXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoZXNjYXBlZFN0ciwgJ2cnKVxuICB9XG5cbiAgLyoqXG4gICAqIFRlbXBvcmFyaWx5IHB1dCBhIHN0cmluZyBpbnRvIHRoZSBjdXJyZW50bHkgbG9hZGVkIGxhbmd1YWdlXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSAge1N0cmluZ30gc3RyaW5nXG4gICAqIEByZXR1cm4ge1N0cmluZ30gc3RyaW5nIGluIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICovXG4gIHB1dChrZXksIHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudFtrZXldID0gc3RyaW5nXG5cbiAgICByZXR1cm4gc3RyaW5nXG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYXJndW1lbnRzIGZvciB0aGUgcmVxdWVzdGVkIHN0cmluZ1xuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSAgdGhlIGtleSB3ZSB1c2UgdG8gbG9va3VwIG91ciB0cmFuc2xhdGlvblxuICAgKiBAcGFyYW0gIHttdWx0aX0gIGFyZ3MgIHN0cmluZywgbnVtYmVyIG9yIG9iamVjdCBjb250YWluaW5nIG91ciBhcmd1bWVudHNcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgIHVwZGF0ZWQgc3RyaW5nIHRyYW5zbGF0aW9uXG4gICAqL1xuICBnZXQoa2V5LCBhcmdzKSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShrZXkpXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gTm8gcmVwbGFjZW1lbnQgbmVlZGVkIGlmIG5vIGFyZ3MgcHJvdmlkZWRcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRva2VucyA9IHZhbHVlLm1hdGNoKC9cXHtbXn1dKz9cXH0vZylcblxuICAgIC8vIE5vIHRva2VucyB0byByZXBsYWNlXG4gICAgaWYgKCF0b2tlbnMpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIC8vIE9iamVjdCBhcmdzOiByZXBsYWNlIGVhY2ggdG9rZW4gd2l0aCBjb3JyZXNwb25kaW5nIGtleVxuICAgIGlmICh0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIGNvbnN0IHRva2VuS2V5ID0gdG9rZW4uc2xpY2UoMSwgLTEpXG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSh0aGlzLm1ha2VTYWZlKHRva2VuKSwgYXJnc1t0b2tlbktleV0gPz8gJycpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFByaW1pdGl2ZSBhcmdzOiByZXBsYWNlIGFsbCB0b2tlbnMgd2l0aCBzYW1lIHZhbHVlXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoL1xce1tefV0rP1xcfS9nLCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2Q6IFByb2Nlc3MgYSBsYW5ndWFnZSBmaWxlIGZyb20gcmF3IHRleHRcbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb2Nlc3NlZCBsYW5ndWFnZVxuICAgKi9cbiAgc3RhdGljIHByb2Nlc3NGaWxlKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIEkxOE4uZnJvbUZpbGUocmVzcG9uc2UucmVwbGFjZUFsbCgnXFxuXFxuJywgJ1xcbicpKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2Q6IFR1cm4gcmF3IHRleHQgZnJvbSB0aGUgbGFuZ3VhZ2UgZmlsZXMgaW50byBmYW5jeSBKU09OXG4gICAqIEBwYXJhbSAge1N0cmluZ30gcmF3VGV4dFxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGNvbnZlcnRlZCBsYW5ndWFnZSBmaWxlXG4gICAqL1xuICBzdGF0aWMgZnJvbUZpbGUocmF3VGV4dCkge1xuICAgIGNvbnN0IGxpbmVzID0gcmF3VGV4dC5zcGxpdCgnXFxuJylcbiAgICBjb25zdCBsYW5nID0ge31cblxuICAgIGZvciAobGV0IG1hdGNoZXMsIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gL14oLis/KSAqPz0gKj8oW15cXG5dKykvXG4gICAgICBtYXRjaGVzID0gcmVnZXguZXhlYyhsaW5lc1tpXSlcbiAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgIGxhbmdbbWF0Y2hlc1sxXV0gPSBtYXRjaGVzWzJdLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYW5nXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybiB7STE4TkJhc2V9IHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbmNlKG9wdGlvbnMpIHtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZSA9IG5ldyBJMThOQmFzZShvcHRpb25zKVxuICAgIH1cbiAgICByZXR1cm4gaW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlICh1c2VmdWwgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBzdGF0aWMgcmVzZXRJbnN0YW5jZSgpIHtcbiAgICBpbnN0YW5jZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgcmVtb3RlbHkgc3RvcmVkIGxhbmd1YWdlIGZpbGVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHBhcmFtICB7Qm9vbGVhbn0gdXNlQ2FjaGVcbiAgICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgcmVzb2x2ZXMgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGxvYWRMYW5nKGxvY2FsZSwgdXNlQ2FjaGUgPSB0cnVlKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBsYW5ndWFnZSBpZiBhbHJlYWR5IGxvYWRlZFxuICAgIGlmICh0aGlzLmxvYWRlZC5pbmNsdWRlcyhsb2NhbGUpICYmIHVzZUNhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5nc1tsb2NhbGVdXG4gICAgfVxuICAgIC8vIEZldGNoIGFuZCBwcm9jZXNzIGxhbmd1YWdlIGZpbGVcbiAgICBjb25zdCBsYW5nRmlsZSA9IGAke3RoaXMuY29uZmlnLmxvY2F0aW9ufSR7bG9jYWxlfSR7dGhpcy5jb25maWcuZXh0ZW5zaW9ufWBcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsYW5nID0gYXdhaXQgZmV0Y2hEYXRhKGxhbmdGaWxlKVxuICAgICAgY29uc3QgcHJvY2Vzc2VkRmlsZSA9IEkxOE5CYXNlLnByb2Nlc3NGaWxlKGxhbmcpXG4gICAgICB0aGlzLmFwcGx5TGFuZ3VhZ2UobG9jYWxlLCBwcm9jZXNzZWRGaWxlKVxuICAgICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYXBwbGllcyBvdmVycmlkZXMgZnJvbSBjb25maWdcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGFuZ1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IG92ZXJyaWRlbiBsYW5ndWFnZVxuICAgKi9cbiAgYXBwbHlMYW5ndWFnZShsb2NhbGUsIGxhbmcgPSB7fSkge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5jb25maWcub3ZlcnJpZGVbbG9jYWxlXSB8fCB7fVxuICAgIGNvbnN0IGV4aXN0aW5nTGFuZyA9IHRoaXMubGFuZ3NbbG9jYWxlXSB8fCB7fVxuICAgIHRoaXMubGFuZ3NbbG9jYWxlXSA9IHsgLi4uZXhpc3RpbmdMYW5nLCAuLi5sYW5nLCAuLi5vdmVycmlkZSB9XG4gICAgdGhpcy5sb2FkZWQucHVzaChsb2NhbGUpXG4gICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBjdXJyZW50bHkgYXZhaWxhYmxlIGxhbmd1YWdlc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IGFsbCBjb25maWd1cmVkIGxhbmd1YWdlc1xuICAgKi9cbiAgZ2V0IGdldExhbmdzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5sYW5nc1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gc2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIHRoZSBsb2NhbCBwcm92aWRlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gICBsb2NhbGVcbiAgICogQHJldHVybiB7UHJvbWlzZX0gbGFuZ3VhZ2VcbiAgICovXG4gIGFzeW5jIHNldEN1cnJlbnQobG9jYWxlID0gJ2VuLVVTJykge1xuICAgIGlmICghdGhpcy5sb2FkZWQuaW5jbHVkZXMobG9jYWxlKSkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTGFuZyhsb2NhbGUpXG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmxhbmdzW2xvY2FsZV1cblxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRcbiAgfVxufVxuXG4vKipcbiAqIFByb3h5IHdyYXBwZXIgdGhhdCBlbmFibGVzIHNpbmdsZXRvbiBwYXR0ZXJuOlxuICogLSBJMThOKCkgcmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gKiAtIG5ldyBJMThOKCkgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZVxuICovXG5leHBvcnQgY29uc3QgSTE4TiA9IG5ldyBQcm94eShJMThOQmFzZSwge1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gSTE4TigpIGlzIGludm9rZWQgYXMgYSBmdW5jdGlvbiAod2l0aG91dCBuZXcpXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKi9cbiAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgcmV0dXJuIHRhcmdldC5nZXRJbnN0YW5jZSguLi5hcmdzKVxuICB9LFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBuZXcgSTE4TigpIGlzIGludm9rZWRcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0KHRhcmdldCwgYXJncykge1xuICAgIHJldHVybiBuZXcgdGFyZ2V0KC4uLmFyZ3MpXG4gIH0sXG5cbiAgLyoqXG4gICAqIFByb3h5IHByb3BlcnR5IGFjY2VzcyB0byB0aGUgYmFzZSBjbGFzc1xuICAgKi9cbiAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgIHJldHVybiB0YXJnZXRbcHJvcF1cbiAgfSxcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IEkxOE4uZ2V0SW5zdGFuY2UoKVxuIl0sIm1hcHBpbmdzIjoiQUFBdUJBLE9BQU9DLE9BQU8sQ0FBRUMsT0FBUSxNQUFPQyxLQUFNLEtDRTVELElBQU1DLEVBQWlCLENBQ3JCQyxVQUFXLFFBRVhDLFNBQVUsZUFFVkMsTUFBTyxDQUFDLFNBQ1JDLE9BQVEsUUFDUkMsU0FBVSxDQUFDLEdBSVRDLEVBQVcsS0FrUkZDLEVBQU8sSUFBSUMsTUEzUXhCLE1BQU1DLEVBS0osV0FBQUMsQ0FBWUMsRUFBVVgsR0FDcEJZLEtBQUtULE1BQVFQLE9BQU9pQixPQUFPLE1BQzNCRCxLQUFLRSxPQUFTLEdBQ2RGLEtBQUtHLGNBQWNKLEVBQ3JCLENBTUEsYUFBQUksQ0FBY0osR0FDWixNQUFNVCxTQUFFQSxLQUFhYyxHQUFnQixJQUFLaEIsS0FBbUJXLEdBRXZETSxFQUFpQmYsRUFBU2dCLFNBQVMsS0FBT2hCLEVBQVcsR0FBR0EsS0FDOURVLEtBQUtPLE9BQVMsQ0FBRWpCLFNBQVVlLEtBQW1CRCxHQUU3QyxNQUFNSSxVQUFFQSxFQUFZLENBQUMsRUFBQWYsU0FBR0EsRUFBVyxDQUFDLEdBQU1PLEtBQUtPLE9BSXpDRSxpQkFBYSxJQUFJQyxJQUFJLElBQUkxQixPQUFPMkIsS0FBS0gsTUFBZXhCLE9BQU8yQixLQUFLbEIsS0FJdEUsSUFBSyxNQUFNRCxLQUFVaUIsRUFBWSxDQUMvQixNQUdNRyxFQUFhLElBSEdKLEVBQVVoQixJQUFXLENBQUMsS0FDdkJDLEVBQVNELElBQVcsQ0FBQyxHQUcxQ1EsS0FBS2EsY0FBY3JCLEVBQVFvQixFQUM3QixDQUVBWixLQUFLUixPQUFTUSxLQUFLTyxPQUFPZixRQUFVUSxLQUFLTyxPQUFPaEIsTUFBTSxFQUN4RCxDQU9BLElBQUF1QixDQUFLZixHQUVILE9BREFDLEtBQUtHLGNBQWMsSUFBS0gsS0FBS08sVUFBV1IsSUFDakNDLEtBQUtlLFdBQVdmLEtBQUtSLE9BQzlCLENBT0EsV0FBQXdCLENBQVl4QixFQUFReUIsRUFBTyxDQUFDLEdBQzFCQSxFQUF1QixpQkFBVEEsRUFBb0JwQixFQUFTcUIsWUFBWUQsR0FBUUEsRUFDL0RqQixLQUFLYSxjQUFjckIsRUFBUXlCLEdBQzNCakIsS0FBS0UsT0FBT2lCLEtBQUszQixHQUNqQlEsS0FBS08sT0FBT2hCLE1BQU00QixLQUFLM0IsRUFDekIsQ0FRQSxRQUFBNEIsQ0FBU0MsRUFBSzdCLEVBQVNRLEtBQUtSLFFBRTFCLE9BRGNRLEtBQUtULE1BQU1DLEtBQVU2QixJQUNuQnJCLEtBQUtzQixpQkFBaUJELEVBQ3hDLENBT0EsZ0JBQUFDLENBQWlCRCxHQUVmLE9BRHFCckMsT0FBT3VDLE9BQU92QixLQUFLVCxPQUFPaUMsS0FBS1AsR0FBUUEsRUFBS0ksTUFDM0NBLEVBQ3hCLENBT0EsUUFBQUksQ0FBU0MsR0FDUCxNQUFNQyxFQUFTLENBQ2IsSUFBS0MsT0FBT0MsR0FBRyxLQUNmLElBQUtELE9BQU9DLEdBQUcsS0FDZixJQUFLRCxPQUFPQyxHQUFHLE1BR1hDLEVBQWFKLEVBQUlLLFdBQVcsU0FBVUMsR0FBV0wsRUFBT0ssSUFFOUQsT0FBTyxJQUFJQyxPQUFPSCxFQUFZLElBQ2hDLENBUUEsR0FBQUksQ0FBSWIsRUFBS2MsR0FHUCxPQUZBbkMsS0FBS29DLFFBQVFmLEdBQU9jLEVBRWJBLENBQ1QsQ0FRQSxHQUFBRSxDQUFJaEIsRUFBS2lCLEdBQ1AsSUFBSUMsRUFBUXZDLEtBQUtvQixTQUFTQyxHQUMxQixJQUFLa0IsRUFDSCxPQUlGLElBQUtELEVBQ0gsT0FBT0MsRUFHVCxNQUFNQyxFQUFTRCxFQUFNRSxNQUFNLGVBRzNCLElBQUtELEVBQ0gsT0FBT0QsRUFJVCxHQUFvQixpQkFBVEQsRUFDVCxJQUFLLE1BQU1JLEtBQVNGLEVBQVEsQ0FDMUIsTUFBTUcsRUFBV0QsRUFBTUUsTUFBTSxHQUFHLEdBQ2hDTCxFQUFRQSxFQUFNTSxRQUFRN0MsS0FBS3lCLFNBQVNpQixHQUFRSixFQUFLSyxJQUFhLEdBQ2hFLE1BR0FKLEVBQVFBLEVBQU1SLFdBQVcsY0FBZU8sR0FHMUMsT0FBT0MsQ0FDVCxDQU9BLGtCQUFPckIsQ0FBWTRCLEdBQ2pCLE9BQU9uRCxFQUFLb0QsU0FBU0QsRUFBU2YsV0FBVyxPQUFRLE1BQ25ELENBT0EsZUFBT2dCLENBQVNDLEdBQ2QsTUFBTUMsRUFBUUQsRUFBUUUsTUFBTSxNQUN0QmpDLEVBQU8sQ0FBQyxFQUVkLElBQUssSUFBSWtDLEVBQVNDLEVBQUksRUFBR0EsRUFBSUgsRUFBTUksT0FBUUQsSUFFekNELEVBQVUsd0JBQU1HLEtBQUtMLEVBQU1HLElBQ3ZCRCxJQUNGbEMsRUFBS2tDLEVBQVEsSUFBTUEsRUFBUSxHQUFHSSxRQUlsQyxPQUFPdEMsQ0FDVCxDQU9BLGtCQUFPdUMsQ0FBWXpELEdBSWpCLE9BSEtMLElBQ0hBLEVBQVcsSUFBSUcsRUFBU0UsSUFFbkJMLENBQ1QsQ0FLQSxvQkFBTytELEdBQ0wvRCxFQUFXLElBQ2IsQ0FRQSxjQUFNZ0UsQ0FBU2xFLEVBQVFtRSxHQUFXLEdBRWhDLEdBQUkzRCxLQUFLRSxPQUFPMEQsU0FBU3BFLElBQVdtRSxFQUNsQyxPQUFPM0QsS0FBS1QsTUFBTUMsR0FHcEIsTUFBTXFFLEVBQVcsR0FBRzdELEtBQUtPLE9BQU9qQixXQUFXRSxJQUFTUSxLQUFLTyxPQUFPbEIsWUFFaEUsSUFDRSxNQUFNNEIsUUR0Tlo2QyxlQUFnQ0MsR0FDOUIsSUFDRSxNQUFNakIsUUFBaUJrQixNQUFNRCxHQUM3QixJQUFLakIsRUFBU21CLEdBQ1osTUFBTSxJQUFJQyxNQUFNLHVCQUF1QnBCLEVBQVNxQixVQUlsRCxhQURtQnJCLEVBREhpQixFQUFJekQsU0FBUyxTQUFXLE9BQVMsU0FHbkQsQ0FBQSxNQUFTOEQsR0FFUCxNQUFNQSxDQUNSLENBQ0YsQ0N5TXlCQyxDQUFVUixHQUN2QlMsRUFBZ0J6RSxFQUFTcUIsWUFBWUQsR0FFM0MsT0FEQWpCLEtBQUthLGNBQWNyQixFQUFROEUsR0FDcEJ0RSxLQUFLVCxNQUFNQyxFQUNwQixDQUFBLE1BQVMrRSxHQUVQLE9BQU92RSxLQUFLYSxjQUFjckIsRUFDNUIsQ0FDRixDQVFBLGFBQUFxQixDQUFjckIsRUFBUXlCLEVBQU8sQ0FBQyxHQUM1QixNQUFNeEIsRUFBV08sS0FBS08sT0FBT2QsU0FBU0QsSUFBVyxDQUFDLEVBQzVDZ0YsRUFBZXhFLEtBQUtULE1BQU1DLElBQVcsQ0FBQyxFQUc1QyxPQUZBUSxLQUFLVCxNQUFNQyxHQUFVLElBQUtnRixLQUFpQnZELEtBQVN4QixHQUNwRE8sS0FBS0UsT0FBT2lCLEtBQUszQixHQUNWUSxLQUFLVCxNQUFNQyxFQUNwQixDQU1BLFlBQUlpRixHQUNGLE9BQU96RSxLQUFLTyxPQUFPaEIsS0FDckIsQ0FPQSxnQkFBTXdCLENBQVd2QixFQUFTLFNBUXhCLE9BUEtRLEtBQUtFLE9BQU8wRCxTQUFTcEUsVUFDbEJRLEtBQUswRCxTQUFTbEUsR0FHdEJRLEtBQUtSLE9BQVNBLEVBQ2RRLEtBQUtvQyxRQUFVcEMsS0FBS1QsTUFBTUMsR0FFbkJRLEtBQUtvQyxPQUNkLEdBUXNDLENBS3RDc0MsTUFBQSxDQUFNQyxFQUFRQyxFQUFTdEMsSUFDZHFDLEVBQU9uQixlQUFlbEIsR0FPL0J1QyxVQUFBLENBQVVGLEVBQVFyQyxJQUNULElBQUlxQyxLQUFVckMsR0FNdkJELElBQUEsQ0FBSXNDLEVBQVFHLElBQ0hILEVBQU9HLEtBSWxCQyxFQUFlcEYsRUFBSzZELHFCIn0=
8
+ Object.freeze({method:"GET",body:""});var t={extension:".lang",location:"assets/lang/",langs:["en-US"],locale:"en-US",override:{}},e=null,n=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),s=(t,e)=>{Array.isArray(t)&&!t.includes(e)&&t.push(e)},l=(t,e)=>e?null!=t:Boolean(t),a=/* @__PURE__ */new Map,i=(t,e)=>{const n=/* @__PURE__ */new Set;return 0===t&&n.add("zero"),n.add(((t,e)=>{const n=1===e?"one":"other";if("undefined"==typeof Intl||"function"!=typeof Intl.PluralRules)return n;if(!a.has(t)){let e=null;try{e=new Intl.PluralRules(String(t).replaceAll("_","-"))}catch{}a.set(t,e)}const s=a.get(t);return s?s.select(e):n})(e,t)),n.add("other"),[...n]},o=new Proxy(class a{constructor(e=t){this.langs=Object.create(null),this.loaded=[],this.processConfig(e)}processConfig(e){const{location:n,...s}={...t,...e},l=n.endsWith("/")?n:`${n}/`;Array.isArray(s.langs)&&(s.langs=[...new Set(s.langs)]),this.config={location:l,...s};const{preloaded:a={},override:i={}}=this.config,o=/* @__PURE__ */new Set([...Object.keys(a),...Object.keys(i)]);for(const t of o){const e={...a[t]||{},...i[t]||{}};this.applyLanguage(t,e)}this.locale=this.config.locale||this.config.langs[0]}init(t){this.processConfig({...this.config,...t});const e=this.getFallbackLocales().filter(t=>!this.loaded.includes(t));return e.length?Promise.all([this.setCurrent(this.locale),...e.map(t=>this.loadLang(t))]).then(([t])=>t):this.setCurrent(this.locale)}addLanguage(t,e={}){e="string"==typeof e?a.processFile(e):e,this.applyLanguage(t,e),s(this.loaded,t),s(this.config.langs,t)}getFallbackLocales(){const{fallbackLocale:t}=this.config;return[].concat(t??[]).filter(t=>"string"==typeof t&&t)}getLocaleChain(t=this.locale){const e=[t],n=String(t).split(/[-_]/)[0];return n&&this.langs[n]&&e.push(n),e.push(...this.getFallbackLocales()),[...new Set(e)]}getValue(t,e=this.locale){if(!this.config.fallbackLocale)return this.langs[e]?.[t]||this.getFallbackValue(t);for(const s of this.getLocaleChain(e)){const e=this.langs[s];if(e&&n(e,t)&&l(e[t],!0))return e[t]}}getPluralValue(t,e,s=this.locale){const a=Boolean(this.config.fallbackLocale),o=a?this.getLocaleChain(s):/* @__PURE__ */new Set([s,...Object.keys(this.langs)]);for(const r of o){const s=this.langs[r];if(s)for(const o of i(e,r)){const e=`${t}.${o}`;if(n(s,e)&&l(s[e],a))return s[e]}}}handleMissing(t){const{onMissing:e}=this.config;if("function"==typeof e){const n=e(t);if("string"==typeof n)return n}}getFallbackValue(t){return Object.values(this.langs).find(e=>e[t])?.[t]}makeSafe(t){const e={"{":String.raw`\{`,"}":String.raw`\}`,"|":String.raw`\|`},n=t.replaceAll(/[{}|]/g,t=>e[t]);return new RegExp(n,"g")}put(t,e,n){let s;return s=void 0===n?this.current||(this.langs[this.locale]??={}):this.langs[n]??={},s[t]=e,e}get(t,e,n=this.locale){const s=Boolean(this.config.fallbackLocale);let a=this.getValue(t,n);if(!l(a,s)){const s=(t=>"number"==typeof t?t:t&&"object"==typeof t&&"number"==typeof t.count?t.count:void 0)(e);a=void 0===s?void 0:this.getPluralValue(t,s,n)}if(!l(a,s))return this.handleMissing({key:t,locale:n,type:"key"});if(!e&&0!==e)return a;const i=a.match(/\{[^}]+?\}/g);if(!i)return a;if("object"==typeof e)for(const l of i){const s=l.slice(1,-1);let i=e[s];null==i&&(i=this.handleMissing({key:t,locale:n,type:"arg",arg:s})??""),a=a.replace(this.makeSafe(l),i)}else a=a.replaceAll(/\{[^}]+?\}/g,e);return a}t(t,e,n){const s=this.get(t,e,n);return void 0===s?t:s}forLocale(t){return(e,n)=>this.t(e,n,t)}static processFile(t){return o.fromFile(t)}static fromFile(t){const e=String(t).replaceAll("\r\n","\n").split("\n"),n={},s=/^(.+?) *?= *?([^\n]+)/,l=t=>{const e=s.exec(t),l=e?.[1].trim();l&&(n[l]=e[2].trim())};let a=null;for(const i of e){let t=i;if(null!==a)t=a+i.trimStart(),a=null;else if(/^\s*[#;]/.test(i))continue;/(^|[^\\])\\$/.test(t)?a=t.slice(0,-1):l(t)}return null!==a&&l(a),n}static parse(t){return o.processFile(t)}static getInstance(t){return e||(e=new a(t)),e}static resetInstance(){e=null}async loadLang(t,e=!0){if(this.loaded.includes(t)&&e)return this.langs[t];const n=`${this.config.location}${t}${this.config.extension}`;try{const e=await async function(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e[t.endsWith(".lang")?"text":"json"]()}catch(e){throw e}}(n),s="string"==typeof e?a.processFile(e):e;return this.applyLanguage(t,s),this.langs[t]}catch(s){return this.applyLanguage(t)}}applyLanguage(t,e={}){const n=this.config.override[t]||{},l=this.langs[t]||{};return this.langs[t]={...l,...e,...n},this.current&&t===this.locale&&(this.current=this.langs[t]),s(this.loaded,t),this.langs[t]}get getLangs(){return this.config.langs}async setCurrent(t="en-US"){return this.loaded.includes(t)||await this.loadLang(t),this.locale=t,this.current=this.langs[t],this.current}},{apply:(t,e,n)=>t.getInstance(...n),construct:(t,e)=>new t(...e),get:(t,e)=>t[e]}),r=o.getInstance();export{o as I18N,r as default};
9
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5lcy5taW4uanMiLCJuYW1lcyI6WyJPYmplY3QiLCJmcmVlemUiLCJtZXRob2QiLCJib2R5IiwiREVGQVVMVF9DT05GSUciLCJleHRlbnNpb24iLCJsb2NhdGlvbiIsImxhbmdzIiwibG9jYWxlIiwib3ZlcnJpZGUiLCJpbnN0YW5jZSIsImhhc093biIsIm9iaiIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInB1c2hVbmlxdWUiLCJhcnIiLCJpdGVtIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5jbHVkZXMiLCJwdXNoIiwiaXNQcmVzZW50IiwidmFsdWUiLCJzdHJpY3QiLCJCb29sZWFuIiwicGx1cmFsUnVsZXNDYWNoZSIsIk1hcCIsImdldFBsdXJhbFN1ZmZpeGVzIiwiY291bnQiLCJzdWZmaXhlcyIsIlNldCIsImFkZCIsImJhc2ljQ2F0ZWdvcnkiLCJJbnRsIiwiUGx1cmFsUnVsZXMiLCJoYXMiLCJydWxlcyIsIlN0cmluZyIsInJlcGxhY2VBbGwiLCJzZXQiLCJnZXQiLCJzZWxlY3QiLCJnZXRQbHVyYWxDYXRlZ29yeSIsIkkxOE4iLCJQcm94eSIsIkkxOE5CYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwidGhpcyIsImNyZWF0ZSIsImxvYWRlZCIsInByb2Nlc3NDb25maWciLCJyZXN0T3B0aW9ucyIsInBhcnNlZExvY2F0aW9uIiwiZW5kc1dpdGgiLCJjb25maWciLCJwcmVsb2FkZWQiLCJhbGxMb2NhbGVzIiwia2V5cyIsIm1lcmdlZExhbmciLCJhcHBseUxhbmd1YWdlIiwiaW5pdCIsImZhbGxiYWNrcyIsImdldEZhbGxiYWNrTG9jYWxlcyIsImZpbHRlciIsImxlbmd0aCIsIlByb21pc2UiLCJhbGwiLCJzZXRDdXJyZW50IiwibWFwIiwibG9hZExhbmciLCJ0aGVuIiwiY3VycmVudCIsImFkZExhbmd1YWdlIiwibGFuZyIsInByb2Nlc3NGaWxlIiwiZmFsbGJhY2tMb2NhbGUiLCJjb25jYXQiLCJnZXRMb2NhbGVDaGFpbiIsImNoYWluIiwiYmFzZUxvY2FsZSIsInNwbGl0IiwiZ2V0VmFsdWUiLCJnZXRGYWxsYmFja1ZhbHVlIiwiY2hhaW5Mb2NhbGUiLCJnZXRQbHVyYWxWYWx1ZSIsImxvY2FsZXMiLCJwbHVyYWxMb2NhbGUiLCJzdWZmaXgiLCJwbHVyYWxLZXkiLCJoYW5kbGVNaXNzaW5nIiwiaW5mbyIsIm9uTWlzc2luZyIsInJlc3VsdCIsInZhbHVlcyIsImZpbmQiLCJtYWtlU2FmZSIsInN0ciIsIm1hcE9iaiIsInJhdyIsImVzY2FwZWRTdHIiLCJtYXRjaGVkIiwiUmVnRXhwIiwicHV0Iiwic3RyaW5nIiwiYXJncyIsImdldENvdW50IiwidHlwZSIsInRva2VucyIsIm1hdGNoIiwidG9rZW4iLCJ0b2tlbktleSIsInNsaWNlIiwicmVwbGFjZW1lbnQiLCJhcmciLCJyZXBsYWNlIiwidCIsImZvckxvY2FsZSIsInJlc3BvbnNlIiwiZnJvbUZpbGUiLCJyYXdUZXh0IiwibGluZXMiLCJyZWdleCIsInBhcnNlTGluZSIsImxpbmUiLCJtYXRjaGVzIiwiZXhlYyIsInRyaW0iLCJjb250aW51ZWQiLCJsb2dpY2FsTGluZSIsInRyaW1TdGFydCIsInRlc3QiLCJwYXJzZSIsInRleHQiLCJnZXRJbnN0YW5jZSIsInJlc2V0SW5zdGFuY2UiLCJ1c2VDYWNoZSIsImxhbmdGaWxlIiwiYXN5bmMiLCJ1cmwiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJlcnJvciIsImZldGNoRGF0YSIsInByb2Nlc3NlZEZpbGUiLCJlcnIiLCJleGlzdGluZ0xhbmciLCJnZXRMYW5ncyIsImFwcGx5IiwidGFyZ2V0IiwidGhpc0FyZyIsImNvbnN0cnVjdCIsInByb3AiLCJtaTE4bl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2ZldGNoLmpzIiwiLi4vc3JjL21pMThuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGRlZmF1bHRPcHRpb25zID0gT2JqZWN0LmZyZWV6ZSh7IG1ldGhvZDogJ0dFVCcsIGJvZHk6ICcnIH0pXG4vKipcbiAqIEZldGNoZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBuZXR3b3JrLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGZldGNoLlxuICogQHBhcmFtIHtPYmplY3R9IFtmZXRjaE9wdGlvbnM9e31dIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBmZXRjaCByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtmZXRjaE9wdGlvbnMuaGVhZGVyc10gLSBIZWFkZXJzIHRvIGluY2x1ZGUgaW4gdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZldGNoT3B0aW9ucy5tZXRob2RdIC0gVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSAoZS5nLiwgJ0dFVCcsICdQT1NUJykuXG4gKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IFtmZXRjaE9wdGlvbnMuYm9keV0gLSBUaGUgYm9keSBvZiB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3BvbnNlIG9iamVjdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHJldHVybi5vayAtIEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc3RhdHVzIGlzIGluIHRoZSByYW5nZSAyMDAtMjk5LlxuICogQHJldHVybiB7bnVtYmVyfSByZXR1cm4uc3RhdHVzIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm4uc3RhdHVzVGV4dCAtIFRoZSBIVFRQIHN0YXR1cyBtZXNzYWdlIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge01hcDxzdHJpbmcsIHN0cmluZz59IHJldHVybi5oZWFkZXJzIC0gVGhlIGhlYWRlcnMgb2YgdGhlIHJlc3BvbnNlLlxuICogQHJldHVybiB7QnVmZmVyfSByZXR1cm4uYm9keSAtIFRoZSBib2R5IG9mIHRoZSByZXNwb25zZSBhcyBhIEJ1ZmZlci5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IFByb21pc2U8QnVmZmVyPn0gcmV0dXJuLmFycmF5QnVmZmVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgYm9keSBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IFByb21pc2U8T2JqZWN0Pn0gcmV0dXJuLmpzb24gLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBib2R5IHBhcnNlZCBhcyBKU09OLlxuICovXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEodXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXIgPSB1cmwuZW5kc1dpdGgoJy5sYW5nJykgPyAndGV4dCcgOiAnanNvbidcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2VbaGFuZGxlcl0oKVxuICAgIHJldHVybiBkYXRhXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignVGhlcmUgaGFzIGJlZW4gYSBwcm9ibGVtIHdpdGggeW91ciBmZXRjaCBvcGVyYXRpb246JywgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmV0Y2hEYXRhIH0gZnJvbSAnLi9mZXRjaC5qcydcblxuY29uc3QgREVGQVVMVF9DT05GSUcgPSB7XG4gIGV4dGVuc2lvbjogJy5sYW5nJyxcbiAgLy8gbG9jYWwgb3IgcmVtb3RlIGRpcmVjdG9yeSBjb250YWluaW5nIGxhbmd1YWdlIGZpbGVzXG4gIGxvY2F0aW9uOiAnYXNzZXRzL2xhbmcvJyxcbiAgLy8gbGlzdCBvZiBhdmFpbGFibGUgbG9jYWxlcywgaGFuZHkgZm9yIHBvcHVsYXRpbmcgc2VsZWN0b3IuXG4gIGxhbmdzOiBbJ2VuLVVTJ10sXG4gIGxvY2FsZTogJ2VuLVVTJywgLy8gaW5pdCB3aXRoIHVzZXIncyBwcmVmZXJyZWQgbGFuZ3VhZ2VcbiAgb3ZlcnJpZGU6IHt9LFxufVxuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2UgaG9sZGVyXG5sZXQgaW5zdGFuY2UgPSBudWxsXG5cbmNvbnN0IGhhc093biA9IChvYmosIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxuXG4vKipcbiAqIEFkZCBhbiBpdGVtIHRvIGFuIGFycmF5IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGFyclxuICogQHBhcmFtIHsqfSBpdGVtXG4gKi9cbmNvbnN0IHB1c2hVbmlxdWUgPSAoYXJyLCBpdGVtKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikgJiYgIWFyci5pbmNsdWRlcyhpdGVtKSkge1xuICAgIGFyci5wdXNoKGl0ZW0pXG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgbG9va2VkIHVwIHZhbHVlIGNvdW50cyBhcyBwcmVzZW50LlxuICogTGVnYWN5IGxvb2t1cHMgdHJlYXQgZW1wdHkgc3RyaW5ncyBhcyBtaXNzaW5nLCBmYWxsYmFja0xvY2FsZSBsb29rdXBzIGRvIG5vdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RyaWN0IHRydWUgd2hlbiBmYWxsYmFja0xvY2FsZSBpcyBjb25maWd1cmVkXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5jb25zdCBpc1ByZXNlbnQgPSAodmFsdWUsIHN0cmljdCkgPT4gKHN0cmljdCA/IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgOiBCb29sZWFuKHZhbHVlKSlcblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBwbHVyYWwgY291bnQgZnJvbSBnZXQvdCBhcmdzXG4gKiBAcGFyYW0geyp9IGFyZ3NcbiAqIEByZXR1cm4ge051bWJlcnx1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGdldENvdW50ID0gYXJncyA9PiB7XG4gIGlmICh0eXBlb2YgYXJncyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYXJnc1xuICB9XG4gIGlmIChhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYXJncy5jb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYXJncy5jb3VudFxuICB9XG59XG5cbmNvbnN0IHBsdXJhbFJ1bGVzQ2FjaGUgPSBuZXcgTWFwKClcblxuLyoqXG4gKiBHZXQgdGhlIENMRFIgcGx1cmFsIGNhdGVnb3J5IGZvciBhIGNvdW50IGluIGEgbG9jYWxlXG4gKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnRcbiAqIEByZXR1cm4ge1N0cmluZ30gcGx1cmFsIGNhdGVnb3J5LCBlZy4gJ29uZScsICdmZXcnLCAnb3RoZXInXG4gKi9cbmNvbnN0IGdldFBsdXJhbENhdGVnb3J5ID0gKGxvY2FsZSwgY291bnQpID0+IHtcbiAgY29uc3QgYmFzaWNDYXRlZ29yeSA9IGNvdW50ID09PSAxID8gJ29uZScgOiAnb3RoZXInXG4gIGlmICh0eXBlb2YgSW50bCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIEludGwuUGx1cmFsUnVsZXMgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmFzaWNDYXRlZ29yeVxuICB9XG4gIGlmICghcGx1cmFsUnVsZXNDYWNoZS5oYXMobG9jYWxlKSkge1xuICAgIGxldCBydWxlcyA9IG51bGxcbiAgICB0cnkge1xuICAgICAgcnVsZXMgPSBuZXcgSW50bC5QbHVyYWxSdWxlcyhTdHJpbmcobG9jYWxlKS5yZXBsYWNlQWxsKCdfJywgJy0nKSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGludmFsaWQgbG9jYWxlIHRhZ1xuICAgIH1cbiAgICBwbHVyYWxSdWxlc0NhY2hlLnNldChsb2NhbGUsIHJ1bGVzKVxuICB9XG4gIGNvbnN0IHJ1bGVzID0gcGx1cmFsUnVsZXNDYWNoZS5nZXQobG9jYWxlKVxuICByZXR1cm4gcnVsZXMgPyBydWxlcy5zZWxlY3QoY291bnQpIDogYmFzaWNDYXRlZ29yeVxufVxuXG4vKipcbiAqIFBsdXJhbCBrZXkgc3VmZml4ZXMgdG8gdHJ5LCBpbiBvcmRlclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxlXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAqL1xuY29uc3QgZ2V0UGx1cmFsU3VmZml4ZXMgPSAoY291bnQsIGxvY2FsZSkgPT4ge1xuICBjb25zdCBzdWZmaXhlcyA9IG5ldyBTZXQoKVxuICBpZiAoY291bnQgPT09IDApIHtcbiAgICBzdWZmaXhlcy5hZGQoJ3plcm8nKVxuICB9XG4gIHN1ZmZpeGVzLmFkZChnZXRQbHVyYWxDYXRlZ29yeShsb2NhbGUsIGNvdW50KSlcbiAgc3VmZml4ZXMuYWRkKCdvdGhlcicpXG4gIHJldHVybiBbLi4uc3VmZml4ZXNdXG59XG5cbi8qKlxuICogTWFpbiBpMThuIGNsYXNzXG4gKiBAY2xhc3MgSTE4TkJhc2VcbiAqIEBjbGFzc2Rlc2MgbWV0aG9kcyBhbmQgZGF0YSBzdG9yZSBmb3IgaTE4blxuICovXG5jbGFzcyBJMThOQmFzZSB7XG4gIC8qKlxuICAgKiBQcm9jZXNzIG9wdGlvbnMgYW5kIHN0YXJ0IHRoZSBtb2R1bGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSBERUZBVUxUX0NPTkZJRykge1xuICAgIHRoaXMubGFuZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5sb2FkZWQgPSBbXVxuICAgIHRoaXMucHJvY2Vzc0NvbmZpZyhvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIHBhcnNlIGFuZCBmb3JtYXQgY29uZmlnXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBwcm9jZXNzQ29uZmlnKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGxvY2F0aW9uLCAuLi5yZXN0T3B0aW9ucyB9ID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4ub3B0aW9ucyB9XG4gICAgLy8gRW5zdXJlIGxvY2F0aW9uIGVuZHMgd2l0aCBhIHNsYXNoXG4gICAgY29uc3QgcGFyc2VkTG9jYXRpb24gPSBsb2NhdGlvbi5lbmRzV2l0aCgnLycpID8gbG9jYXRpb24gOiBgJHtsb2NhdGlvbn0vYFxuICAgIC8vIENvcHkgbGFuZ3Mgc28gdGhlIGRlZmF1bHRzIGFuZCB1c2VyIHN1cHBsaWVkIGFycmF5cyBhcmUgbmV2ZXIgbXV0YXRlZFxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3RPcHRpb25zLmxhbmdzKSkge1xuICAgICAgcmVzdE9wdGlvbnMubGFuZ3MgPSBbLi4ubmV3IFNldChyZXN0T3B0aW9ucy5sYW5ncyldXG4gICAgfVxuICAgIHRoaXMuY29uZmlnID0geyBsb2NhdGlvbjogcGFyc2VkTG9jYXRpb24sIC4uLnJlc3RPcHRpb25zIH1cblxuICAgIGNvbnN0IHsgcHJlbG9hZGVkID0ge30sIG92ZXJyaWRlID0ge30gfSA9IHRoaXMuY29uZmlnXG5cbiAgICAvLyBNZXJnZSBsb2NhbGVzIGZyb20gYm90aCBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlXG4gICAgLy8gVGhpcyBzdXBwb3J0cyBsZWdhY3kgdXNhZ2Ugd2hlcmUgb3ZlcnJpZGUgZGVmaW5lZCBlbnRpcmUgbGFuZ3VhZ2VzXG4gICAgY29uc3QgYWxsTG9jYWxlcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKHByZWxvYWRlZCksIC4uLk9iamVjdC5rZXlzKG92ZXJyaWRlKV0pXG5cbiAgICAvLyBBcHBseSBsYW5ndWFnZXMgZnJvbSBib3RoIHByZWxvYWRlZCBhbmQgb3ZlcnJpZGVcbiAgICAvLyBhcHBseUxhbmd1YWdlIHdpbGwgbWVyZ2UgdGhlbSBwcm9wZXJseSAoZXhpc3RpbmcgKyBwcmVsb2FkZWQgKyBvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBhbGxMb2NhbGVzKSB7XG4gICAgICBjb25zdCBwcmVsb2FkZWRMYW5nID0gcHJlbG9hZGVkW2xvY2FsZV0gfHwge31cbiAgICAgIGNvbnN0IG92ZXJyaWRlTGFuZyA9IG92ZXJyaWRlW2xvY2FsZV0gfHwge31cbiAgICAgIC8vIE1lcmdlIHByZWxvYWRlZCBhbmQgb3ZlcnJpZGUgZm9yIHRoaXMgbG9jYWxlXG4gICAgICBjb25zdCBtZXJnZWRMYW5nID0geyAuLi5wcmVsb2FkZWRMYW5nLCAuLi5vdmVycmlkZUxhbmcgfVxuICAgICAgdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSwgbWVyZ2VkTGFuZylcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuY29uZmlnLmxvY2FsZSB8fCB0aGlzLmNvbmZpZy5sYW5nc1swXVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbGFuZ3VhZ2UgYW5kIHNldCBkZWZhdWx0XG4gICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICAgcmVzb2x2ZXMgbGFuZ3VhZ2VcbiAgICovXG4gIGluaXQob3B0aW9ucykge1xuICAgIHRoaXMucHJvY2Vzc0NvbmZpZyh7IC4uLnRoaXMuY29uZmlnLCAuLi5vcHRpb25zIH0pXG4gICAgLy8gRmFsbGJhY2sgbG9jYWxlcyBhcmUgbG9hZGVkIGFsb25nc2lkZSB0aGUgY3VycmVudCBsb2NhbGUgc28gbG9va3VwcyBjYW4gZmFsbCBiYWNrIHRvIHRoZW1cbiAgICBjb25zdCBmYWxsYmFja3MgPSB0aGlzLmdldEZhbGxiYWNrTG9jYWxlcygpLmZpbHRlcihsb2NhbGUgPT4gIXRoaXMubG9hZGVkLmluY2x1ZGVzKGxvY2FsZSkpXG4gICAgaWYgKCFmYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRDdXJyZW50KHRoaXMubG9jYWxlKVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuc2V0Q3VycmVudCh0aGlzLmxvY2FsZSksIC4uLmZhbGxiYWNrcy5tYXAobG9jYWxlID0+IHRoaXMubG9hZExhbmcobG9jYWxlKSldKS50aGVuKFxuICAgICAgKFtjdXJyZW50XSkgPT4gY3VycmVudCxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGxhbmd1YWdlIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGxhbmdcbiAgICovXG4gIGFkZExhbmd1YWdlKGxvY2FsZSwgbGFuZyA9IHt9KSB7XG4gICAgbGFuZyA9IHR5cGVvZiBsYW5nID09PSAnc3RyaW5nJyA/IEkxOE5CYXNlLnByb2Nlc3NGaWxlKGxhbmcpIDogbGFuZ1xuICAgIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUsIGxhbmcpXG4gICAgcHVzaFVuaXF1ZSh0aGlzLmxvYWRlZCwgbG9jYWxlKVxuICAgIHB1c2hVbmlxdWUodGhpcy5jb25maWcubGFuZ3MsIGxvY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVkIGZhbGxiYWNrIGxvY2FsZXNcbiAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAqL1xuICBnZXRGYWxsYmFja0xvY2FsZXMoKSB7XG4gICAgY29uc3QgeyBmYWxsYmFja0xvY2FsZSB9ID0gdGhpcy5jb25maWdcbiAgICByZXR1cm4gW10uY29uY2F0KGZhbGxiYWNrTG9jYWxlID8/IFtdKS5maWx0ZXIobG9jYWxlID0+IHR5cGVvZiBsb2NhbGUgPT09ICdzdHJpbmcnICYmIGxvY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NhbGVzIGNoZWNrZWQsIGluIG9yZGVyLCB3aGVuIGxvb2tpbmcgdXAgYSBrZXkgd2l0aCBmYWxsYmFja0xvY2FsZSBjb25maWd1cmVkOlxuICAgKiByZXF1ZXN0ZWQgbG9jYWxlLCBpdHMgYmFzZSBsYW5ndWFnZSAoaWYgbG9hZGVkKSwgdGhlbiBlYWNoIGZhbGxiYWNrIGxvY2FsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICovXG4gIGdldExvY2FsZUNoYWluKGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgY29uc3QgY2hhaW4gPSBbbG9jYWxlXVxuICAgIGNvbnN0IGJhc2VMb2NhbGUgPSBTdHJpbmcobG9jYWxlKS5zcGxpdCgvWy1fXS8pWzBdXG4gICAgaWYgKGJhc2VMb2NhbGUgJiYgdGhpcy5sYW5nc1tiYXNlTG9jYWxlXSkge1xuICAgICAgY2hhaW4ucHVzaChiYXNlTG9jYWxlKVxuICAgIH1cbiAgICBjaGFpbi5wdXNoKC4uLnRoaXMuZ2V0RmFsbGJhY2tMb2NhbGVzKCkpXG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KGNoYWluKV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYSBzdHJpbmcgZnJvbSBhIGxvYWRlZCBsYW5ndWFnZSBmaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5ICAtIHRoZSBrZXkgZm9yIHRoZSBzdHJpbmcgd2UgYXJlIHRyeWluZyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZSAtIGxvY2FsZSB0byBjaGVjayBmb3IgdmFsdWVcbiAgICogQHJldHVybiB7U3RyaW5nfSBsYW5ndWFnZSBzdHJpbmcgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRWYWx1ZShrZXksIGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmZhbGxiYWNrTG9jYWxlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYWluTG9jYWxlIG9mIHRoaXMuZ2V0TG9jYWxlQ2hhaW4obG9jYWxlKSkge1xuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nc1tjaGFpbkxvY2FsZV1cbiAgICAgICAgaWYgKGxhbmcgJiYgaGFzT3duKGxhbmcsIGtleSkgJiYgaXNQcmVzZW50KGxhbmdba2V5XSwgdHJ1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbGFuZ1trZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5sYW5nc1tsb2NhbGVdPy5ba2V5XVxuICAgIHJldHVybiB2YWx1ZSB8fCB0aGlzLmdldEZhbGxiYWNrVmFsdWUoa2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBwbHVyYWwgZm9ybSBvZiBrZXksIGVnLiBga2V5Lnplcm9gLCBga2V5Lm9uZWAsIGBrZXkub3RoZXJgXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSAge051bWJlcn0gY291bnRcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHJldHVybiB7U3RyaW5nfSBwbHVyYWwgc3RyaW5nIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0UGx1cmFsVmFsdWUoa2V5LCBjb3VudCwgbG9jYWxlID0gdGhpcy5sb2NhbGUpIHtcbiAgICBjb25zdCBzdHJpY3QgPSBCb29sZWFuKHRoaXMuY29uZmlnLmZhbGxiYWNrTG9jYWxlKVxuICAgIGNvbnN0IGxvY2FsZXMgPSBzdHJpY3QgPyB0aGlzLmdldExvY2FsZUNoYWluKGxvY2FsZSkgOiBuZXcgU2V0KFtsb2NhbGUsIC4uLk9iamVjdC5rZXlzKHRoaXMubGFuZ3MpXSlcblxuICAgIGZvciAoY29uc3QgcGx1cmFsTG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmdzW3BsdXJhbExvY2FsZV1cbiAgICAgIGlmICghbGFuZykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBzdWZmaXggb2YgZ2V0UGx1cmFsU3VmZml4ZXMoY291bnQsIHBsdXJhbExvY2FsZSkpIHtcbiAgICAgICAgY29uc3QgcGx1cmFsS2V5ID0gYCR7a2V5fS4ke3N1ZmZpeH1gXG4gICAgICAgIGlmIChoYXNPd24obGFuZywgcGx1cmFsS2V5KSAmJiBpc1ByZXNlbnQobGFuZ1twbHVyYWxLZXldLCBzdHJpY3QpKSB7XG4gICAgICAgICAgcmV0dXJuIGxhbmdbcGx1cmFsS2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBhIG1pc3Npbmcga2V5IG9yIGFyZ3VtZW50IHRvIHRoZSBvbk1pc3NpbmcgaGFuZGxlclxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGluZm8geyBrZXksIGxvY2FsZSwgdHlwZSwgYXJnIH1cbiAgICogQHJldHVybiB7U3RyaW5nfSByZXBsYWNlbWVudCBzdHJpbmcgcmV0dXJuZWQgYnkgb25NaXNzaW5nIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgaGFuZGxlTWlzc2luZyhpbmZvKSB7XG4gICAgY29uc3QgeyBvbk1pc3NpbmcgfSA9IHRoaXMuY29uZmlnXG4gICAgaWYgKHR5cGVvZiBvbk1pc3NpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9uTWlzc2luZyhpbmZvKVxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIGxhbmd1YWdlIHRoYXQgaGFzIGRlc2lyZWQga2V5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdmFsdWUga2V5XG4gICAqIEByZXR1cm4ge1N0cmluZ30gZm91bmQgdmFsdWUgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRGYWxsYmFja1ZhbHVlKGtleSkge1xuICAgIGNvbnN0IGZhbGxiYWNrTGFuZyA9IE9iamVjdC52YWx1ZXModGhpcy5sYW5ncykuZmluZChsYW5nID0+IGxhbmdba2V5XSlcbiAgICByZXR1cm4gZmFsbGJhY2tMYW5nPy5ba2V5XVxuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZSB2YXJpYWJsZSBzeW50YXhcbiAgICogQHBhcmFtICB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgZXNjYXBlZCBzdHJcbiAgICovXG4gIG1ha2VTYWZlKHN0cikge1xuICAgIGNvbnN0IG1hcE9iaiA9IHtcbiAgICAgICd7JzogU3RyaW5nLnJhd2BcXHtgLFxuICAgICAgJ30nOiBTdHJpbmcucmF3YFxcfWAsXG4gICAgICAnfCc6IFN0cmluZy5yYXdgXFx8YCxcbiAgICB9XG5cbiAgICBjb25zdCBlc2NhcGVkU3RyID0gc3RyLnJlcGxhY2VBbGwoL1t7fXxdL2csIG1hdGNoZWQgPT4gbWFwT2JqW21hdGNoZWRdKVxuXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoZXNjYXBlZFN0ciwgJ2cnKVxuICB9XG5cbiAgLyoqXG4gICAqIFRlbXBvcmFyaWx5IHB1dCBhIHN0cmluZyBpbnRvIHRoZSBjdXJyZW50bHkgbG9hZGVkIGxhbmd1YWdlLCBvciB0aGUgZ2l2ZW4gbG9jYWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSAge1N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlIG9wdGlvbmFsIGxvY2FsZSB0byB3cml0ZSB0b1xuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyBpbiBjdXJyZW50IGxhbmd1YWdlXG4gICAqL1xuICBwdXQoa2V5LCBzdHJpbmcsIGxvY2FsZSkge1xuICAgIGxldCBsYW5nXG4gICAgaWYgKGxvY2FsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYW5nID0gdGhpcy5jdXJyZW50IHx8ICh0aGlzLmxhbmdzW3RoaXMubG9jYWxlXSA/Pz0ge30pXG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbmcgPSB0aGlzLmxhbmdzW2xvY2FsZV0gPz89IHt9XG4gICAgfVxuICAgIGxhbmdba2V5XSA9IHN0cmluZ1xuXG4gICAgcmV0dXJuIHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFyZ3VtZW50cyBmb3IgdGhlIHJlcXVlc3RlZCBzdHJpbmdcbiAgICogQHBhcmFtICB7U3RyaW5nfSBrZXkgIHRoZSBrZXkgd2UgdXNlIHRvIGxvb2t1cCBvdXIgdHJhbnNsYXRpb25cbiAgICogQHBhcmFtICB7bXVsdGl9ICBhcmdzICBzdHJpbmcsIG51bWJlciBvciBvYmplY3QgY29udGFpbmluZyBvdXIgYXJndW1lbnRzXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlIG9wdGlvbmFsIGxvY2FsZSwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgbG9jYWxlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgICB1cGRhdGVkIHN0cmluZyB0cmFuc2xhdGlvblxuICAgKi9cbiAgZ2V0KGtleSwgYXJncywgbG9jYWxlID0gdGhpcy5sb2NhbGUpIHtcbiAgICBjb25zdCBzdHJpY3QgPSBCb29sZWFuKHRoaXMuY29uZmlnLmZhbGxiYWNrTG9jYWxlKVxuICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoa2V5LCBsb2NhbGUpXG5cbiAgICBpZiAoIWlzUHJlc2VudCh2YWx1ZSwgc3RyaWN0KSkge1xuICAgICAgY29uc3QgY291bnQgPSBnZXRDb3VudChhcmdzKVxuICAgICAgdmFsdWUgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5nZXRQbHVyYWxWYWx1ZShrZXksIGNvdW50LCBsb2NhbGUpXG4gICAgfVxuXG4gICAgaWYgKCFpc1ByZXNlbnQodmFsdWUsIHN0cmljdCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZU1pc3NpbmcoeyBrZXksIGxvY2FsZSwgdHlwZTogJ2tleScgfSlcbiAgICB9XG5cbiAgICAvLyBObyByZXBsYWNlbWVudCBuZWVkZWQgaWYgbm8gYXJncyBwcm92aWRlZFxuICAgIGlmICghYXJncyAmJiBhcmdzICE9PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSB2YWx1ZS5tYXRjaCgvXFx7W159XSs/XFx9L2cpXG5cbiAgICAvLyBObyB0b2tlbnMgdG8gcmVwbGFjZVxuICAgIGlmICghdG9rZW5zKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICAvLyBPYmplY3QgYXJnczogcmVwbGFjZSBlYWNoIHRva2VuIHdpdGggY29ycmVzcG9uZGluZyBrZXlcbiAgICBpZiAodHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBjb25zdCB0b2tlbktleSA9IHRva2VuLnNsaWNlKDEsIC0xKVxuICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSBhcmdzW3Rva2VuS2V5XVxuICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCB8fCByZXBsYWNlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gdGhpcy5oYW5kbGVNaXNzaW5nKHsga2V5LCBsb2NhbGUsIHR5cGU6ICdhcmcnLCBhcmc6IHRva2VuS2V5IH0pID8/ICcnXG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHRoaXMubWFrZVNhZmUodG9rZW4pLCByZXBsYWNlbWVudClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUHJpbWl0aXZlIGFyZ3M6IHJlcGxhY2UgYWxsIHRva2VucyB3aXRoIHNhbWUgdmFsdWVcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgvXFx7W159XSs/XFx9L2csIGFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTGlrZSBnZXQoKSBidXQgYWx3YXlzIHJldHVybnMgYSBzdHJpbmcsIGZhbGxpbmcgYmFjayB0byB0aGUga2V5IGl0c2VsZlxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSAgdGhlIGtleSB3ZSB1c2UgdG8gbG9va3VwIG91ciB0cmFuc2xhdGlvblxuICAgKiBAcGFyYW0gIHttdWx0aX0gIGFyZ3MgIHN0cmluZywgbnVtYmVyIG9yIG9iamVjdCBjb250YWluaW5nIG91ciBhcmd1bWVudHNcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGUgb3B0aW9uYWwgbG9jYWxlLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBsb2NhbGVcbiAgICogQHJldHVybiB7U3RyaW5nfSB0cmFuc2xhdGVkIHN0cmluZyBvciBrZXlcbiAgICovXG4gIHQoa2V5LCBhcmdzLCBsb2NhbGUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGtleSwgYXJncywgbG9jYWxlKVxuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8ga2V5IDogdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2xhdGUgZnVuY3Rpb24gYm91bmQgdG8gYSBsb2NhbGVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHJldHVybiB7RnVuY3Rpb259IChrZXksIGFyZ3MpID0+IHN0cmluZ1xuICAgKi9cbiAgZm9yTG9jYWxlKGxvY2FsZSkge1xuICAgIHJldHVybiAoa2V5LCBhcmdzKSA9PiB0aGlzLnQoa2V5LCBhcmdzLCBsb2NhbGUpXG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZDogUHJvY2VzcyBhIGxhbmd1YWdlIGZpbGUgZnJvbSByYXcgdGV4dFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHJlc3BvbnNlXG4gICAqIEByZXR1cm4ge09iamVjdH0gcHJvY2Vzc2VkIGxhbmd1YWdlXG4gICAqL1xuICBzdGF0aWMgcHJvY2Vzc0ZpbGUocmVzcG9uc2UpIHtcbiAgICAvLyBibGFuayBsaW5lcyBhcmUgaWdub3JlZCBieSBmcm9tRmlsZVxuICAgIHJldHVybiBJMThOLmZyb21GaWxlKHJlc3BvbnNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2Q6IFR1cm4gcmF3IHRleHQgZnJvbSB0aGUgbGFuZ3VhZ2UgZmlsZXMgaW50byBmYW5jeSBKU09OXG4gICAqIFN1cHBvcnRzIGAjYCBhbmQgYDtgIGZ1bGwtbGluZSBjb21tZW50cyBhbmQgdHJhaWxpbmcgYFxcYCBsaW5lIGNvbnRpbnVhdGlvblxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHJhd1RleHRcbiAgICogQHJldHVybiB7T2JqZWN0fSBjb252ZXJ0ZWQgbGFuZ3VhZ2UgZmlsZVxuICAgKi9cbiAgc3RhdGljIGZyb21GaWxlKHJhd1RleHQpIHtcbiAgICBjb25zdCBsaW5lcyA9IFN0cmluZyhyYXdUZXh0KS5yZXBsYWNlQWxsKCdcXHJcXG4nLCAnXFxuJykuc3BsaXQoJ1xcbicpXG4gICAgY29uc3QgbGFuZyA9IHt9XG4gICAgY29uc3QgcmVnZXggPSAvXiguKz8pICo/PSAqPyhbXlxcbl0rKS9cbiAgICBjb25zdCBwYXJzZUxpbmUgPSBsaW5lID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSByZWdleC5leGVjKGxpbmUpXG4gICAgICBjb25zdCBrZXkgPSBtYXRjaGVzPy5bMV0udHJpbSgpXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGxhbmdba2V5XSA9IG1hdGNoZXNbMl0udHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGNvbnRpbnVlZCA9IG51bGxcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGxldCBsb2dpY2FsTGluZSA9IGxpbmVcbiAgICAgIGlmIChjb250aW51ZWQgIT09IG51bGwpIHtcbiAgICAgICAgbG9naWNhbExpbmUgPSBjb250aW51ZWQgKyBsaW5lLnRyaW1TdGFydCgpXG4gICAgICAgIGNvbnRpbnVlZCA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoL15cXHMqWyM7XS8udGVzdChsaW5lKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBhIHNpbmdsZSB0cmFpbGluZyBiYWNrc2xhc2ggam9pbnMgdGhlIG5leHQgbGluZVxuICAgICAgaWYgKC8oXnxbXlxcXFxdKVxcXFwkLy50ZXN0KGxvZ2ljYWxMaW5lKSkge1xuICAgICAgICBjb250aW51ZWQgPSBsb2dpY2FsTGluZS5zbGljZSgwLCAtMSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcGFyc2VMaW5lKGxvZ2ljYWxMaW5lKVxuICAgIH1cblxuICAgIGlmIChjb250aW51ZWQgIT09IG51bGwpIHtcbiAgICAgIHBhcnNlTGluZShjb250aW51ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kOiBQYXJzZSB0aGUgY29udGVudHMgb2YgYSBgLmxhbmdgIGZpbGUsIGFsaWFzIG9mIHByb2Nlc3NGaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gdGV4dFxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb2Nlc3NlZCBsYW5ndWFnZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlKHRleHQpIHtcbiAgICByZXR1cm4gSTE4Ti5wcm9jZXNzRmlsZSh0ZXh0KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge0kxOE5CYXNlfSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZShvcHRpb25zKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgSTE4TkJhc2Uob3B0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAodXNlZnVsIGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgc3RhdGljIHJlc2V0SW5zdGFuY2UoKSB7XG4gICAgaW5zdGFuY2UgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHJlbW90ZWx5IHN0b3JlZCBsYW5ndWFnZSBmaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IHVzZUNhY2hlXG4gICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICAgIHJlc29sdmVzIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBsb2FkTGFuZyhsb2NhbGUsIHVzZUNhY2hlID0gdHJ1ZSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgbGFuZ3VhZ2UgaWYgYWxyZWFkeSBsb2FkZWRcbiAgICBpZiAodGhpcy5sb2FkZWQuaW5jbHVkZXMobG9jYWxlKSAmJiB1c2VDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICAgIH1cbiAgICAvLyBGZXRjaCBhbmQgcHJvY2VzcyBsYW5ndWFnZSBmaWxlXG4gICAgY29uc3QgbGFuZ0ZpbGUgPSBgJHt0aGlzLmNvbmZpZy5sb2NhdGlvbn0ke2xvY2FsZX0ke3RoaXMuY29uZmlnLmV4dGVuc2lvbn1gXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFuZyA9IGF3YWl0IGZldGNoRGF0YShsYW5nRmlsZSlcbiAgICAgIGNvbnN0IHByb2Nlc3NlZEZpbGUgPSB0eXBlb2YgbGFuZyA9PT0gJ3N0cmluZycgPyBJMThOQmFzZS5wcm9jZXNzRmlsZShsYW5nKSA6IGxhbmdcbiAgICAgIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUsIHByb2Nlc3NlZEZpbGUpXG4gICAgICByZXR1cm4gdGhpcy5sYW5nc1tsb2NhbGVdXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5TGFuZ3VhZ2UobG9jYWxlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBhcHBsaWVzIG92ZXJyaWRlcyBmcm9tIGNvbmZpZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsYW5nXG4gICAqIEByZXR1cm4ge09iamVjdH0gb3ZlcnJpZGVuIGxhbmd1YWdlXG4gICAqL1xuICBhcHBseUxhbmd1YWdlKGxvY2FsZSwgbGFuZyA9IHt9KSB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLmNvbmZpZy5vdmVycmlkZVtsb2NhbGVdIHx8IHt9XG4gICAgY29uc3QgZXhpc3RpbmdMYW5nID0gdGhpcy5sYW5nc1tsb2NhbGVdIHx8IHt9XG4gICAgdGhpcy5sYW5nc1tsb2NhbGVdID0geyAuLi5leGlzdGluZ0xhbmcsIC4uLmxhbmcsIC4uLm92ZXJyaWRlIH1cbiAgICAvLyBrZWVwIHRoZSBjdXJyZW50IGxhbmd1YWdlIHJlZmVyZW5jZSBpbiBzeW5jXG4gICAgaWYgKHRoaXMuY3VycmVudCAmJiBsb2NhbGUgPT09IHRoaXMubG9jYWxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmxhbmdzW2xvY2FsZV1cbiAgICB9XG4gICAgcHVzaFVuaXF1ZSh0aGlzLmxvYWRlZCwgbG9jYWxlKVxuICAgIHJldHVybiB0aGlzLmxhbmdzW2xvY2FsZV1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gY3VycmVudGx5IGF2YWlsYWJsZSBsYW5ndWFnZXNcbiAgICogQHJldHVybiB7T2JqZWN0fSBhbGwgY29uZmlndXJlZCBsYW5ndWFnZXNcbiAgICovXG4gIGdldCBnZXRMYW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubGFuZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byB0aGUgbG9jYWwgcHJvdmlkZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9ICAgbG9jYWxlXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IGxhbmd1YWdlXG4gICAqL1xuICBhc3luYyBzZXRDdXJyZW50KGxvY2FsZSA9ICdlbi1VUycpIHtcbiAgICBpZiAoIXRoaXMubG9hZGVkLmluY2x1ZGVzKGxvY2FsZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExhbmcobG9jYWxlKVxuICAgIH1cblxuICAgIHRoaXMubG9jYWxlID0gbG9jYWxlXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5sYW5nc1tsb2NhbGVdXG5cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50XG4gIH1cbn1cblxuLyoqXG4gKiBQcm94eSB3cmFwcGVyIHRoYXQgZW5hYmxlcyBzaW5nbGV0b24gcGF0dGVybjpcbiAqIC0gSTE4TigpIHJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICogLSBuZXcgSTE4TigpIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IEkxOE4gPSBuZXcgUHJveHkoSTE4TkJhc2UsIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIEkxOE4oKSBpcyBpbnZva2VkIGFzIGEgZnVuY3Rpb24gKHdpdGhvdXQgbmV3KVxuICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIGFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncykge1xuICAgIHJldHVybiB0YXJnZXQuZ2V0SW5zdGFuY2UoLi4uYXJncylcbiAgfSxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gbmV3IEkxOE4oKSBpcyBpbnZva2VkXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdCh0YXJnZXQsIGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IHRhcmdldCguLi5hcmdzKVxuICB9LFxuXG4gIC8qKlxuICAgKiBQcm94eSBwcm9wZXJ0eSBhY2Nlc3MgdG8gdGhlIGJhc2UgY2xhc3NcbiAgICovXG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BdXG4gIH0sXG59KVxuXG5leHBvcnQgZGVmYXVsdCBJMThOLmdldEluc3RhbmNlKClcbiJdLCJtYXBwaW5ncyI6IkFBQXVCQSxPQUFPQyxPQUFPLENBQUVDLE9BQVEsTUFBT0MsS0FBTSxLQ0U1RCxJQUFNQyxFQUFpQixDQUNyQkMsVUFBVyxRQUVYQyxTQUFVLGVBRVZDLE1BQU8sQ0FBQyxTQUNSQyxPQUFRLFFBQ1JDLFNBQVUsQ0FBQyxHQUlUQyxFQUFXLEtBRVRDLEVBQUEsQ0FBVUMsRUFBS0MsSUFBUWIsT0FBT2MsVUFBVUMsZUFBZUMsS0FB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
Binary file
@@ -1,9 +1,9 @@
1
1
 
2
2
  /**
3
3
  @draggable/i18n - https://github.com/Draggable/i18n
4
- Version: 1.1.1
4
+ Version: 1.2.0
5
5
  Author: Draggable https://draggable.io
6
6
  */
7
7
 
8
- var i18n=function(t){Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),Object.freeze({method:"GET",body:""});var e={extension:".lang",location:"assets/lang/",langs:["en-US"],locale:"en-US",override:{}},n=null,s=new Proxy(class t{constructor(t=e){this.langs=Object.create(null),this.loaded=[],this.processConfig(t)}processConfig(t){const{location:n,...s}={...e,...t},a=n.endsWith("/")?n:`${n}/`;this.config={location:a,...s};const{preloaded:i={},override:r={}}=this.config,l=new Set([...Object.keys(i),...Object.keys(r)]);for(const e of l){const t={...i[e]||{},...r[e]||{}};this.applyLanguage(e,t)}this.locale=this.config.locale||this.config.langs[0]}init(t){return this.processConfig({...this.config,...t}),this.setCurrent(this.locale)}addLanguage(e,n={}){n="string"==typeof n?t.processFile(n):n,this.applyLanguage(e,n),this.loaded.push(e),this.config.langs.push(e)}getValue(t,e=this.locale){return this.langs[e]?.[t]||this.getFallbackValue(t)}getFallbackValue(t){return Object.values(this.langs).find(e=>e[t])?.[t]}makeSafe(t){const e={"{":String.raw`\{`,"}":String.raw`\}`,"|":String.raw`\|`},n=t.replaceAll(/[{}|]/g,t=>e[t]);return new RegExp(n,"g")}put(t,e){return this.current[t]=e,e}get(t,e){let n=this.getValue(t);if(!n)return;if(!e)return n;const s=n.match(/\{[^}]+?\}/g);if(!s)return n;if("object"==typeof e)for(const a of s){const t=a.slice(1,-1);n=n.replace(this.makeSafe(a),e[t]??"")}else n=n.replaceAll(/\{[^}]+?\}/g,e);return n}static processFile(t){return s.fromFile(t.replaceAll("\n\n","\n"))}static fromFile(t){const e=t.split("\n"),n={};for(let s,a=0;a<e.length;a++)s=/^(.+?) *?= *?([^\n]+)/.exec(e[a]),s&&(n[s[1]]=s[2].trim());return n}static getInstance(e){return n||(n=new t(e)),n}static resetInstance(){n=null}async loadLang(e,n=!0){if(this.loaded.includes(e)&&n)return this.langs[e];const s=`${this.config.location}${e}${this.config.extension}`;try{const n=await async function(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e[t.endsWith(".lang")?"text":"json"]()}catch(e){throw e}}(s),a=t.processFile(n);return this.applyLanguage(e,a),this.langs[e]}catch(a){return this.applyLanguage(e)}}applyLanguage(t,e={}){const n=this.config.override[t]||{},s=this.langs[t]||{};return this.langs[t]={...s,...e,...n},this.loaded.push(t),this.langs[t]}get getLangs(){return this.config.langs}async setCurrent(t="en-US"){return this.loaded.includes(t)||await this.loadLang(t),this.locale=t,this.current=this.langs[t],this.current}},{apply:(t,e,n)=>t.getInstance(...n),construct:(t,e)=>new t(...e),get:(t,e)=>t[e]}),a=s.getInstance();return t.I18N=s,t.default=a,t}({});
9
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5paWZlLm1pbi5qcyIsIm5hbWVzIjpbImkxOG4iLCJleHBvcnRzIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydGllcyIsIl9fZXNNb2R1bGUiLCJ2YWx1ZSIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiZnJlZXplIiwibWV0aG9kIiwiYm9keSIsIkRFRkFVTFRfQ09ORklHIiwiZXh0ZW5zaW9uIiwibG9jYXRpb24iLCJsYW5ncyIsImxvY2FsZSIsIm92ZXJyaWRlIiwiaW5zdGFuY2UiLCJJMThOIiwiUHJveHkiLCJJMThOQmFzZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInRoaXMiLCJjcmVhdGUiLCJsb2FkZWQiLCJwcm9jZXNzQ29uZmlnIiwicmVzdE9wdGlvbnMiLCJwYXJzZWRMb2NhdGlvbiIsImVuZHNXaXRoIiwiY29uZmlnIiwicHJlbG9hZGVkIiwiYWxsTG9jYWxlcyIsIlNldCIsImtleXMiLCJtZXJnZWRMYW5nIiwiYXBwbHlMYW5ndWFnZSIsImluaXQiLCJzZXRDdXJyZW50IiwiYWRkTGFuZ3VhZ2UiLCJsYW5nIiwicHJvY2Vzc0ZpbGUiLCJwdXNoIiwiZ2V0VmFsdWUiLCJrZXkiLCJnZXRGYWxsYmFja1ZhbHVlIiwidmFsdWVzIiwiZmluZCIsIm1ha2VTYWZlIiwic3RyIiwibWFwT2JqIiwiU3RyaW5nIiwicmF3IiwiZXNjYXBlZFN0ciIsInJlcGxhY2VBbGwiLCJtYXRjaGVkIiwiUmVnRXhwIiwicHV0Iiwic3RyaW5nIiwiY3VycmVudCIsImdldCIsImFyZ3MiLCJ0b2tlbnMiLCJtYXRjaCIsInRva2VuIiwidG9rZW5LZXkiLCJzbGljZSIsInJlcGxhY2UiLCJyZXNwb25zZSIsImZyb21GaWxlIiwicmF3VGV4dCIsImxpbmVzIiwic3BsaXQiLCJtYXRjaGVzIiwiaSIsImxlbmd0aCIsImV4ZWMiLCJ0cmltIiwiZ2V0SW5zdGFuY2UiLCJyZXNldEluc3RhbmNlIiwibG9hZExhbmciLCJ1c2VDYWNoZSIsImluY2x1ZGVzIiwibGFuZ0ZpbGUiLCJhc3luYyIsInVybCIsImZldGNoIiwib2siLCJFcnJvciIsInN0YXR1cyIsImVycm9yIiwiZmV0Y2hEYXRhIiwicHJvY2Vzc2VkRmlsZSIsImVyciIsImV4aXN0aW5nTGFuZyIsImdldExhbmdzIiwiYXBwbHkiLCJ0YXJnZXQiLCJ0aGlzQXJnIiwiY29uc3RydWN0IiwicHJvcCIsIm1pMThuX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2ZldGNoLmpzIiwiLi4vc3JjL21pMThuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGRlZmF1bHRPcHRpb25zID0gT2JqZWN0LmZyZWV6ZSh7IG1ldGhvZDogJ0dFVCcsIGJvZHk6ICcnIH0pXG4vKipcbiAqIEZldGNoZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBuZXR3b3JrLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGZldGNoLlxuICogQHBhcmFtIHtPYmplY3R9IFtmZXRjaE9wdGlvbnM9e31dIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBmZXRjaCByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtmZXRjaE9wdGlvbnMuaGVhZGVyc10gLSBIZWFkZXJzIHRvIGluY2x1ZGUgaW4gdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZldGNoT3B0aW9ucy5tZXRob2RdIC0gVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSAoZS5nLiwgJ0dFVCcsICdQT1NUJykuXG4gKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IFtmZXRjaE9wdGlvbnMuYm9keV0gLSBUaGUgYm9keSBvZiB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3BvbnNlIG9iamVjdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHJldHVybi5vayAtIEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc3RhdHVzIGlzIGluIHRoZSByYW5nZSAyMDAtMjk5LlxuICogQHJldHVybiB7bnVtYmVyfSByZXR1cm4uc3RhdHVzIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm4uc3RhdHVzVGV4dCAtIFRoZSBIVFRQIHN0YXR1cyBtZXNzYWdlIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge01hcDxzdHJpbmcsIHN0cmluZz59IHJldHVybi5oZWFkZXJzIC0gVGhlIGhlYWRlcnMgb2YgdGhlIHJlc3BvbnNlLlxuICogQHJldHVybiB7QnVmZmVyfSByZXR1cm4uYm9keSAtIFRoZSBib2R5IG9mIHRoZSByZXNwb25zZSBhcyBhIEJ1ZmZlci5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IFByb21pc2U8QnVmZmVyPn0gcmV0dXJuLmFycmF5QnVmZmVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgYm9keSBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IFByb21pc2U8T2JqZWN0Pn0gcmV0dXJuLmpzb24gLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBib2R5IHBhcnNlZCBhcyBKU09OLlxuICovXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEodXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXIgPSB1cmwuZW5kc1dpdGgoJy5sYW5nJykgPyAndGV4dCcgOiAnanNvbidcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2VbaGFuZGxlcl0oKVxuICAgIHJldHVybiBkYXRhXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignVGhlcmUgaGFzIGJlZW4gYSBwcm9ibGVtIHdpdGggeW91ciBmZXRjaCBvcGVyYXRpb246JywgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmV0Y2hEYXRhIH0gZnJvbSAnLi9mZXRjaC5qcydcblxuY29uc3QgREVGQVVMVF9DT05GSUcgPSB7XG4gIGV4dGVuc2lvbjogJy5sYW5nJyxcbiAgLy8gbG9jYWwgb3IgcmVtb3RlIGRpcmVjdG9yeSBjb250YWluaW5nIGxhbmd1YWdlIGZpbGVzXG4gIGxvY2F0aW9uOiAnYXNzZXRzL2xhbmcvJyxcbiAgLy8gbGlzdCBvZiBhdmFpbGFibGUgbG9jYWxlcywgaGFuZHkgZm9yIHBvcHVsYXRpbmcgc2VsZWN0b3IuXG4gIGxhbmdzOiBbJ2VuLVVTJ10sXG4gIGxvY2FsZTogJ2VuLVVTJywgLy8gaW5pdCB3aXRoIHVzZXIncyBwcmVmZXJyZWQgbGFuZ3VhZ2VcbiAgb3ZlcnJpZGU6IHt9LFxufVxuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2UgaG9sZGVyXG5sZXQgaW5zdGFuY2UgPSBudWxsXG5cbi8qKlxuICogTWFpbiBpMThuIGNsYXNzXG4gKiBAY2xhc3MgSTE4TkJhc2VcbiAqIEBjbGFzc2Rlc2MgbWV0aG9kcyBhbmQgZGF0YSBzdG9yZSBmb3IgaTE4blxuICovXG5jbGFzcyBJMThOQmFzZSB7XG4gIC8qKlxuICAgKiBQcm9jZXNzIG9wdGlvbnMgYW5kIHN0YXJ0IHRoZSBtb2R1bGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSBERUZBVUxUX0NPTkZJRykge1xuICAgIHRoaXMubGFuZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5sb2FkZWQgPSBbXVxuICAgIHRoaXMucHJvY2Vzc0NvbmZpZyhvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIHBhcnNlIGFuZCBmb3JtYXQgY29uZmlnXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBwcm9jZXNzQ29uZmlnKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGxvY2F0aW9uLCAuLi5yZXN0T3B0aW9ucyB9ID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4ub3B0aW9ucyB9XG4gICAgLy8gRW5zdXJlIGxvY2F0aW9uIGVuZHMgd2l0aCBhIHNsYXNoXG4gICAgY29uc3QgcGFyc2VkTG9jYXRpb24gPSBsb2NhdGlvbi5lbmRzV2l0aCgnLycpID8gbG9jYXRpb24gOiBgJHtsb2NhdGlvbn0vYFxuICAgIHRoaXMuY29uZmlnID0geyBsb2NhdGlvbjogcGFyc2VkTG9jYXRpb24sIC4uLnJlc3RPcHRpb25zIH1cblxuICAgIGNvbnN0IHsgcHJlbG9hZGVkID0ge30sIG92ZXJyaWRlID0ge30gfSA9IHRoaXMuY29uZmlnXG5cbiAgICAvLyBNZXJnZSBsb2NhbGVzIGZyb20gYm90aCBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlXG4gICAgLy8gVGhpcyBzdXBwb3J0cyBsZWdhY3kgdXNhZ2Ugd2hlcmUgb3ZlcnJpZGUgZGVmaW5lZCBlbnRpcmUgbGFuZ3VhZ2VzXG4gICAgY29uc3QgYWxsTG9jYWxlcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKHByZWxvYWRlZCksIC4uLk9iamVjdC5rZXlzKG92ZXJyaWRlKV0pXG5cbiAgICAvLyBBcHBseSBsYW5ndWFnZXMgZnJvbSBib3RoIHByZWxvYWRlZCBhbmQgb3ZlcnJpZGVcbiAgICAvLyBhcHBseUxhbmd1YWdlIHdpbGwgbWVyZ2UgdGhlbSBwcm9wZXJseSAoZXhpc3RpbmcgKyBwcmVsb2FkZWQgKyBvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBhbGxMb2NhbGVzKSB7XG4gICAgICBjb25zdCBwcmVsb2FkZWRMYW5nID0gcHJlbG9hZGVkW2xvY2FsZV0gfHwge31cbiAgICAgIGNvbnN0IG92ZXJyaWRlTGFuZyA9IG92ZXJyaWRlW2xvY2FsZV0gfHwge31cbiAgICAgIC8vIE1lcmdlIHByZWxvYWRlZCBhbmQgb3ZlcnJpZGUgZm9yIHRoaXMgbG9jYWxlXG4gICAgICBjb25zdCBtZXJnZWRMYW5nID0geyAuLi5wcmVsb2FkZWRMYW5nLCAuLi5vdmVycmlkZUxhbmcgfVxuICAgICAgdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSwgbWVyZ2VkTGFuZylcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuY29uZmlnLmxvY2FsZSB8fCB0aGlzLmNvbmZpZy5sYW5nc1swXVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbGFuZ3VhZ2UgYW5kIHNldCBkZWZhdWx0XG4gICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICAgcmVzb2x2ZXMgbGFuZ3VhZ2VcbiAgICovXG4gIGluaXQob3B0aW9ucykge1xuICAgIHRoaXMucHJvY2Vzc0NvbmZpZyh7IC4uLnRoaXMuY29uZmlnLCAuLi5vcHRpb25zIH0pXG4gICAgcmV0dXJuIHRoaXMuc2V0Q3VycmVudCh0aGlzLmxvY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbGFuZ3VhZ2UgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxhbmd1YWdlc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gbGFuZ1xuICAgKi9cbiAgYWRkTGFuZ3VhZ2UobG9jYWxlLCBsYW5nID0ge30pIHtcbiAgICBsYW5nID0gdHlwZW9mIGxhbmcgPT09ICdzdHJpbmcnID8gSTE4TkJhc2UucHJvY2Vzc0ZpbGUobGFuZykgOiBsYW5nXG4gICAgdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSwgbGFuZylcbiAgICB0aGlzLmxvYWRlZC5wdXNoKGxvY2FsZSlcbiAgICB0aGlzLmNvbmZpZy5sYW5ncy5wdXNoKGxvY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYSBzdHJpbmcgZnJvbSBhIGxvYWRlZCBsYW5ndWFnZSBmaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5ICAtIHRoZSBrZXkgZm9yIHRoZSBzdHJpbmcgd2UgYXJlIHRyeWluZyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZSAtIGxvY2FsZSB0byBjaGVjayBmb3IgdmFsdWVcbiAgICogQHJldHVybiB7U3RyaW5nfSBsYW5ndWFnZSBzdHJpbmcgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRWYWx1ZShrZXksIGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmxhbmdzW2xvY2FsZV0/LltrZXldXG4gICAgcmV0dXJuIHZhbHVlIHx8IHRoaXMuZ2V0RmFsbGJhY2tWYWx1ZShrZXkpXG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIGxhbmd1YWdlIHRoYXQgaGFzIGRlc2lyZWQga2V5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdmFsdWUga2V5XG4gICAqIEByZXR1cm4ge1N0cmluZ30gZm91bmQgdmFsdWUgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRGYWxsYmFja1ZhbHVlKGtleSkge1xuICAgIGNvbnN0IGZhbGxiYWNrTGFuZyA9IE9iamVjdC52YWx1ZXModGhpcy5sYW5ncykuZmluZChsYW5nID0+IGxhbmdba2V5XSlcbiAgICByZXR1cm4gZmFsbGJhY2tMYW5nPy5ba2V5XVxuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZSB2YXJpYWJsZSBzeW50YXhcbiAgICogQHBhcmFtICB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgZXNjYXBlZCBzdHJcbiAgICovXG4gIG1ha2VTYWZlKHN0cikge1xuICAgIGNvbnN0IG1hcE9iaiA9IHtcbiAgICAgICd7JzogU3RyaW5nLnJhd2BcXHtgLFxuICAgICAgJ30nOiBTdHJpbmcucmF3YFxcfWAsXG4gICAgICAnfCc6IFN0cmluZy5yYXdgXFx8YCxcbiAgICB9XG5cbiAgICBjb25zdCBlc2NhcGVkU3RyID0gc3RyLnJlcGxhY2VBbGwoL1t7fXxdL2csIG1hdGNoZWQgPT4gbWFwT2JqW21hdGNoZWRdKVxuXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoZXNjYXBlZFN0ciwgJ2cnKVxuICB9XG5cbiAgLyoqXG4gICAqIFRlbXBvcmFyaWx5IHB1dCBhIHN0cmluZyBpbnRvIHRoZSBjdXJyZW50bHkgbG9hZGVkIGxhbmd1YWdlXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSAge1N0cmluZ30gc3RyaW5nXG4gICAqIEByZXR1cm4ge1N0cmluZ30gc3RyaW5nIGluIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICovXG4gIHB1dChrZXksIHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudFtrZXldID0gc3RyaW5nXG5cbiAgICByZXR1cm4gc3RyaW5nXG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYXJndW1lbnRzIGZvciB0aGUgcmVxdWVzdGVkIHN0cmluZ1xuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSAgdGhlIGtleSB3ZSB1c2UgdG8gbG9va3VwIG91ciB0cmFuc2xhdGlvblxuICAgKiBAcGFyYW0gIHttdWx0aX0gIGFyZ3MgIHN0cmluZywgbnVtYmVyIG9yIG9iamVjdCBjb250YWluaW5nIG91ciBhcmd1bWVudHNcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgIHVwZGF0ZWQgc3RyaW5nIHRyYW5zbGF0aW9uXG4gICAqL1xuICBnZXQoa2V5LCBhcmdzKSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShrZXkpXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gTm8gcmVwbGFjZW1lbnQgbmVlZGVkIGlmIG5vIGFyZ3MgcHJvdmlkZWRcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRva2VucyA9IHZhbHVlLm1hdGNoKC9cXHtbXn1dKz9cXH0vZylcblxuICAgIC8vIE5vIHRva2VucyB0byByZXBsYWNlXG4gICAgaWYgKCF0b2tlbnMpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIC8vIE9iamVjdCBhcmdzOiByZXBsYWNlIGVhY2ggdG9rZW4gd2l0aCBjb3JyZXNwb25kaW5nIGtleVxuICAgIGlmICh0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIGNvbnN0IHRva2VuS2V5ID0gdG9rZW4uc2xpY2UoMSwgLTEpXG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSh0aGlzLm1ha2VTYWZlKHRva2VuKSwgYXJnc1t0b2tlbktleV0gPz8gJycpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFByaW1pdGl2ZSBhcmdzOiByZXBsYWNlIGFsbCB0b2tlbnMgd2l0aCBzYW1lIHZhbHVlXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoL1xce1tefV0rP1xcfS9nLCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2Q6IFByb2Nlc3MgYSBsYW5ndWFnZSBmaWxlIGZyb20gcmF3IHRleHRcbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb2Nlc3NlZCBsYW5ndWFnZVxuICAgKi9cbiAgc3RhdGljIHByb2Nlc3NGaWxlKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIEkxOE4uZnJvbUZpbGUocmVzcG9uc2UucmVwbGFjZUFsbCgnXFxuXFxuJywgJ1xcbicpKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2Q6IFR1cm4gcmF3IHRleHQgZnJvbSB0aGUgbGFuZ3VhZ2UgZmlsZXMgaW50byBmYW5jeSBKU09OXG4gICAqIEBwYXJhbSAge1N0cmluZ30gcmF3VGV4dFxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGNvbnZlcnRlZCBsYW5ndWFnZSBmaWxlXG4gICAqL1xuICBzdGF0aWMgZnJvbUZpbGUocmF3VGV4dCkge1xuICAgIGNvbnN0IGxpbmVzID0gcmF3VGV4dC5zcGxpdCgnXFxuJylcbiAgICBjb25zdCBsYW5nID0ge31cblxuICAgIGZvciAobGV0IG1hdGNoZXMsIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gL14oLis/KSAqPz0gKj8oW15cXG5dKykvXG4gICAgICBtYXRjaGVzID0gcmVnZXguZXhlYyhsaW5lc1tpXSlcbiAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgIGxhbmdbbWF0Y2hlc1sxXV0gPSBtYXRjaGVzWzJdLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYW5nXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybiB7STE4TkJhc2V9IHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbmNlKG9wdGlvbnMpIHtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZSA9IG5ldyBJMThOQmFzZShvcHRpb25zKVxuICAgIH1cbiAgICByZXR1cm4gaW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlICh1c2VmdWwgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBzdGF0aWMgcmVzZXRJbnN0YW5jZSgpIHtcbiAgICBpbnN0YW5jZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgcmVtb3RlbHkgc3RvcmVkIGxhbmd1YWdlIGZpbGVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHBhcmFtICB7Qm9vbGVhbn0gdXNlQ2FjaGVcbiAgICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgcmVzb2x2ZXMgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGxvYWRMYW5nKGxvY2FsZSwgdXNlQ2FjaGUgPSB0cnVlKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBsYW5ndWFnZSBpZiBhbHJlYWR5IGxvYWRlZFxuICAgIGlmICh0aGlzLmxvYWRlZC5pbmNsdWRlcyhsb2NhbGUpICYmIHVzZUNhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5nc1tsb2NhbGVdXG4gICAgfVxuICAgIC8vIEZldGNoIGFuZCBwcm9jZXNzIGxhbmd1YWdlIGZpbGVcbiAgICBjb25zdCBsYW5nRmlsZSA9IGAke3RoaXMuY29uZmlnLmxvY2F0aW9ufSR7bG9jYWxlfSR7dGhpcy5jb25maWcuZXh0ZW5zaW9ufWBcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsYW5nID0gYXdhaXQgZmV0Y2hEYXRhKGxhbmdGaWxlKVxuICAgICAgY29uc3QgcHJvY2Vzc2VkRmlsZSA9IEkxOE5CYXNlLnByb2Nlc3NGaWxlKGxhbmcpXG4gICAgICB0aGlzLmFwcGx5TGFuZ3VhZ2UobG9jYWxlLCBwcm9jZXNzZWRGaWxlKVxuICAgICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYXBwbGllcyBvdmVycmlkZXMgZnJvbSBjb25maWdcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGFuZ1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IG92ZXJyaWRlbiBsYW5ndWFnZVxuICAgKi9cbiAgYXBwbHlMYW5ndWFnZShsb2NhbGUsIGxhbmcgPSB7fSkge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5jb25maWcub3ZlcnJpZGVbbG9jYWxlXSB8fCB7fVxuICAgIGNvbnN0IGV4aXN0aW5nTGFuZyA9IHRoaXMubGFuZ3NbbG9jYWxlXSB8fCB7fVxuICAgIHRoaXMubGFuZ3NbbG9jYWxlXSA9IHsgLi4uZXhpc3RpbmdMYW5nLCAuLi5sYW5nLCAuLi5vdmVycmlkZSB9XG4gICAgdGhpcy5sb2FkZWQucHVzaChsb2NhbGUpXG4gICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBjdXJyZW50bHkgYXZhaWxhYmxlIGxhbmd1YWdlc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IGFsbCBjb25maWd1cmVkIGxhbmd1YWdlc1xuICAgKi9cbiAgZ2V0IGdldExhbmdzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5sYW5nc1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gc2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIHRoZSBsb2NhbCBwcm92aWRlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gICBsb2NhbGVcbiAgICogQHJldHVybiB7UHJvbWlzZX0gbGFuZ3VhZ2VcbiAgICovXG4gIGFzeW5jIHNldEN1cnJlbnQobG9jYWxlID0gJ2VuLVVTJykge1xuICAgIGlmICghdGhpcy5sb2FkZWQuaW5jbHVkZXMobG9jYWxlKSkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTGFuZyhsb2NhbGUpXG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmxhbmdzW2xvY2FsZV1cblxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRcbiAgfVxufVxuXG4vKipcbiAqIFByb3h5IHdyYXBwZXIgdGhhdCBlbmFibGVzIHNpbmdsZXRvbiBwYXR0ZXJuOlxuICogLSBJMThOKCkgcmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gKiAtIG5ldyBJMThOKCkgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZVxuICovXG5leHBvcnQgY29uc3QgSTE4TiA9IG5ldyBQcm94eShJMThOQmFzZSwge1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gSTE4TigpIGlzIGludm9rZWQgYXMgYSBmdW5jdGlvbiAod2l0aG91dCBuZXcpXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKi9cbiAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgcmV0dXJuIHRhcmdldC5nZXRJbnN0YW5jZSguLi5hcmdzKVxuICB9LFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBuZXcgSTE4TigpIGlzIGludm9rZWRcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0KHRhcmdldCwgYXJncykge1xuICAgIHJldHVybiBuZXcgdGFyZ2V0KC4uLmFyZ3MpXG4gIH0sXG5cbiAgLyoqXG4gICAqIFByb3h5IHByb3BlcnR5IGFjY2VzcyB0byB0aGUgYmFzZSBjbGFzc1xuICAgKi9cbiAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgIHJldHVybiB0YXJnZXRbcHJvcF1cbiAgfSxcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IEkxOE4uZ2V0SW5zdGFuY2UoKVxuIl0sIm1hcHBpbmdzIjoiQSw4R0FBdUJFLE9BQU9NLE9BQU8sQ0FBRUMsT0FBUSxNQUFPQyxLQUFNLEtDRTVELElBQU1DLEVBQWlCLENBQ3JCQyxVQUFXLFFBRVhDLFNBQVUsZUFFVkMsTUFBTyxDQUFDLFNBQ1JDLE9BQVEsUUFDUkMsU0FBVSxDQUFDLEdBSVRDLEVBQVcsS0FrUkZDLEVBQU8sSUFBSUMsTUEzUXhCLE1BQU1DLEVBS0osV0FBQUMsQ0FBWUMsRUFBVVgsR0FDcEJZLEtBQUtULE1BQVFaLE9BQU9zQixPQUFPLE1BQzNCRCxLQUFLRSxPQUFTLEdBQ2RGLEtBQUtHLGNBQWNKLEVBQ3JCLENBTUEsYUFBQUksQ0FBY0osR0FDWixNQUFNVCxTQUFFQSxLQUFhYyxHQUFnQixJQUFLaEIsS0FBbUJXLEdBRXZETSxFQUFpQmYsRUFBU2dCLFNBQVMsS0FBT2hCLEVBQVcsR0FBR0EsS0FDOURVLEtBQUtPLE9BQVMsQ0FBRWpCLFNBQVVlLEtBQW1CRCxHQUU3QyxNQUFNSSxVQUFFQSxFQUFZLENBQUMsRUFBQWYsU0FBR0EsRUFBVyxDQUFDLEdBQU1PLEtBQUtPLE9BSXpDRSxFQUFhLElBQUlDLElBQUksSUFBSS9CLE9BQU9nQyxLQUFLSCxNQUFlN0IsT0FBT2dDLEtBQUtsQixLQUl0RSxJQUFLLE1BQU1ELEtBQVVpQixFQUFZLENBQy9CLE1BR01HLEVBQWEsSUFIR0osRUFBVWhCLElBQVcsQ0FBQyxLQUN2QkMsRUFBU0QsSUFBVyxDQUFDLEdBRzFDUSxLQUFLYSxjQUFjckIsRUFBUW9CLEVBQzdCLENBRUFaLEtBQUtSLE9BQVNRLEtBQUtPLE9BQU9mLFFBQVVRLEtBQUtPLE9BQU9oQixNQUFNLEVBQ3hELENBT0EsSUFBQXVCLENBQUtmLEdBRUgsT0FEQUMsS0FBS0csY0FBYyxJQUFLSCxLQUFLTyxVQUFXUixJQUNqQ0MsS0FBS2UsV0FBV2YsS0FBS1IsT0FDOUIsQ0FPQSxXQUFBd0IsQ0FBWXhCLEVBQVF5QixFQUFPLENBQUMsR0FDMUJBLEVBQXVCLGlCQUFUQSxFQUFvQnBCLEVBQVNxQixZQUFZRCxHQUFRQSxFQUMvRGpCLEtBQUthLGNBQWNyQixFQUFReUIsR0FDM0JqQixLQUFLRSxPQUFPaUIsS0FBSzNCLEdBQ2pCUSxLQUFLTyxPQUFPaEIsTUFBTTRCLEtBQUszQixFQUN6QixDQVFBLFFBQUE0QixDQUFTQyxFQUFLN0IsRUFBU1EsS0FBS1IsUUFFMUIsT0FEY1EsS0FBS1QsTUFBTUMsS0FBVTZCLElBQ25CckIsS0FBS3NCLGlCQUFpQkQsRUFDeEMsQ0FPQSxnQkFBQUMsQ0FBaUJELEdBRWYsT0FEcUIxQyxPQUFPNEMsT0FBT3ZCLEtBQUtULE9BQU9pQyxLQUFLUCxHQUFRQSxFQUFLSSxNQUMzQ0EsRUFDeEIsQ0FPQSxRQUFBSSxDQUFTQyxHQUNQLE1BQU1DLEVBQVMsQ0FDYixJQUFLQyxPQUFPQyxHQUFHLEtBQ2YsSUFBS0QsT0FBT0MsR0FBRyxLQUNmLElBQUtELE9BQU9DLEdBQUcsTUFHWEMsRUFBYUosRUFBSUssV0FBVyxTQUFVQyxHQUFXTCxFQUFPSyxJQUU5RCxPQUFPLElBQUlDLE9BQU9ILEVBQVksSUFDaEMsQ0FRQSxHQUFBSSxDQUFJYixFQUFLYyxHQUdQLE9BRkFuQyxLQUFLb0MsUUFBUWYsR0FBT2MsRUFFYkEsQ0FDVCxDQVFBLEdBQUFFLENBQUloQixFQUFLaUIsR0FDUCxJQUFJeEQsRUFBUWtCLEtBQUtvQixTQUFTQyxHQUMxQixJQUFLdkMsRUFDSCxPQUlGLElBQUt3RCxFQUNILE9BQU94RCxFQUdULE1BQU15RCxFQUFTekQsRUFBTTBELE1BQU0sZUFHM0IsSUFBS0QsRUFDSCxPQUFPekQsRUFJVCxHQUFvQixpQkFBVHdELEVBQ1QsSUFBSyxNQUFNRyxLQUFTRixFQUFRLENBQzFCLE1BQU1HLEVBQVdELEVBQU1FLE1BQU0sR0FBRyxHQUNoQzdELEVBQVFBLEVBQU04RCxRQUFRNUMsS0FBS3lCLFNBQVNnQixHQUFRSCxFQUFLSSxJQUFhLEdBQ2hFLE1BR0E1RCxFQUFRQSxFQUFNaUQsV0FBVyxjQUFlTyxHQUcxQyxPQUFPeEQsQ0FDVCxDQU9BLGtCQUFPb0MsQ0FBWTJCLEdBQ2pCLE9BQU9sRCxFQUFLbUQsU0FBU0QsRUFBU2QsV0FBVyxPQUFRLE1BQ25ELENBT0EsZUFBT2UsQ0FBU0MsR0FDZCxNQUFNQyxFQUFRRCxFQUFRRSxNQUFNLE1BQ3RCaEMsRUFBTyxDQUFDLEVBRWQsSUFBSyxJQUFJaUMsRUFBU0MsRUFBSSxFQUFHQSxFQUFJSCxFQUFNSSxPQUFRRCxJQUV6Q0QsRUFBVSx3QkFBTUcsS0FBS0wsRUFBTUcsSUFDdkJELElBQ0ZqQyxFQUFLaUMsRUFBUSxJQUFNQSxFQUFRLEdBQUdJLFFBSWxDLE9BQU9yQyxDQUNULENBT0Esa0JBQU9zQyxDQUFZeEQsR0FJakIsT0FIS0wsSUFDSEEsRUFBVyxJQUFJRyxFQUFTRSxJQUVuQkwsQ0FDVCxDQUtBLG9CQUFPOEQsR0FDTDlELEVBQVcsSUFDYixDQVFBLGNBQU0rRCxDQUFTakUsRUFBUWtFLEdBQVcsR0FFaEMsR0FBSTFELEtBQUtFLE9BQU95RCxTQUFTbkUsSUFBV2tFLEVBQ2xDLE9BQU8xRCxLQUFLVCxNQUFNQyxHQUdwQixNQUFNb0UsRUFBVyxHQUFHNUQsS0FBS08sT0FBT2pCLFdBQVdFLElBQVNRLEtBQUtPLE9BQU9sQixZQUVoRSxJQUNFLE1BQU00QixRRHROWjRDLGVBQWdDQyxHQUM5QixJQUNFLE1BQU1qQixRQUFpQmtCLE1BQU1ELEdBQzdCLElBQUtqQixFQUFTbUIsR0FDWixNQUFNLElBQUlDLE1BQU0sdUJBQXVCcEIsRUFBU3FCLFVBSWxELGFBRG1CckIsRUFESGlCLEVBQUl4RCxTQUFTLFNBQVcsT0FBUyxTQUduRCxDQUFBLE1BQVM2RCxHQUVQLE1BQU1BLENBQ1IsQ0FDRixDQ3lNeUJDLENBQVVSLEdBQ3ZCUyxFQUFnQnhFLEVBQVNxQixZQUFZRCxHQUUzQyxPQURBakIsS0FBS2EsY0FBY3JCLEVBQVE2RSxHQUNwQnJFLEtBQUtULE1BQU1DLEVBQ3BCLENBQUEsTUFBUzhFLEdBRVAsT0FBT3RFLEtBQUthLGNBQWNyQixFQUM1QixDQUNGLENBUUEsYUFBQXFCLENBQWNyQixFQUFReUIsRUFBTyxDQUFDLEdBQzVCLE1BQU14QixFQUFXTyxLQUFLTyxPQUFPZCxTQUFTRCxJQUFXLENBQUMsRUFDNUMrRSxFQUFldkUsS0FBS1QsTUFBTUMsSUFBVyxDQUFDLEVBRzVDLE9BRkFRLEtBQUtULE1BQU1DLEdBQVUsSUFBSytFLEtBQWlCdEQsS0FBU3hCLEdBQ3BETyxLQUFLRSxPQUFPaUIsS0FBSzNCLEdBQ1ZRLEtBQUtULE1BQU1DLEVBQ3BCLENBTUEsWUFBSWdGLEdBQ0YsT0FBT3hFLEtBQUtPLE9BQU9oQixLQUNyQixDQU9BLGdCQUFNd0IsQ0FBV3ZCLEVBQVMsU0FReEIsT0FQS1EsS0FBS0UsT0FBT3lELFNBQVNuRSxVQUNsQlEsS0FBS3lELFNBQVNqRSxHQUd0QlEsS0FBS1IsT0FBU0EsRUFDZFEsS0FBS29DLFFBQVVwQyxLQUFLVCxNQUFNQyxHQUVuQlEsS0FBS29DLE9BQ2QsR0FRc0MsQ0FLdENxQyxNQUFBLENBQU1DLEVBQVFDLEVBQVNyQyxJQUNkb0MsRUFBT25CLGVBQWVqQixHQU8vQnNDLFVBQUEsQ0FBVUYsRUFBUXBDLElBQ1QsSUFBSW9DLEtBQVVwQyxHQU12QkQsSUFBQSxDQUFJcUMsRUFBUUcsSUFDSEgsRUFBT0csS0FJbEJDLEVBQWVuRixFQUFLNEQsYyJ9
8
+ var i18n=function(t){Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),Object.freeze({method:"GET",body:""});var e={extension:".lang",location:"assets/lang/",langs:["en-US"],locale:"en-US",override:{}},n=null,s=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),l=(t,e)=>{Array.isArray(t)&&!t.includes(e)&&t.push(e)},a=(t,e)=>e?null!=t:Boolean(t),i=new Map,o=(t,e)=>{const n=new Set;return 0===t&&n.add("zero"),n.add(((t,e)=>{const n=1===e?"one":"other";if("undefined"==typeof Intl||"function"!=typeof Intl.PluralRules)return n;if(!i.has(t)){let e=null;try{e=new Intl.PluralRules(String(t).replaceAll("_","-"))}catch{}i.set(t,e)}const s=i.get(t);return s?s.select(e):n})(e,t)),n.add("other"),[...n]},r=new Proxy(class t{constructor(t=e){this.langs=Object.create(null),this.loaded=[],this.processConfig(t)}processConfig(t){const{location:n,...s}={...e,...t},l=n.endsWith("/")?n:`${n}/`;Array.isArray(s.langs)&&(s.langs=[...new Set(s.langs)]),this.config={location:l,...s};const{preloaded:a={},override:i={}}=this.config,o=new Set([...Object.keys(a),...Object.keys(i)]);for(const e of o){const t={...a[e]||{},...i[e]||{}};this.applyLanguage(e,t)}this.locale=this.config.locale||this.config.langs[0]}init(t){this.processConfig({...this.config,...t});const e=this.getFallbackLocales().filter(t=>!this.loaded.includes(t));return e.length?Promise.all([this.setCurrent(this.locale),...e.map(t=>this.loadLang(t))]).then(([t])=>t):this.setCurrent(this.locale)}addLanguage(e,n={}){n="string"==typeof n?t.processFile(n):n,this.applyLanguage(e,n),l(this.loaded,e),l(this.config.langs,e)}getFallbackLocales(){const{fallbackLocale:t}=this.config;return[].concat(t??[]).filter(t=>"string"==typeof t&&t)}getLocaleChain(t=this.locale){const e=[t],n=String(t).split(/[-_]/)[0];return n&&this.langs[n]&&e.push(n),e.push(...this.getFallbackLocales()),[...new Set(e)]}getValue(t,e=this.locale){if(!this.config.fallbackLocale)return this.langs[e]?.[t]||this.getFallbackValue(t);for(const n of this.getLocaleChain(e)){const e=this.langs[n];if(e&&s(e,t)&&a(e[t],!0))return e[t]}}getPluralValue(t,e,n=this.locale){const l=Boolean(this.config.fallbackLocale),i=l?this.getLocaleChain(n):new Set([n,...Object.keys(this.langs)]);for(const r of i){const n=this.langs[r];if(n)for(const i of o(e,r)){const e=`${t}.${i}`;if(s(n,e)&&a(n[e],l))return n[e]}}}handleMissing(t){const{onMissing:e}=this.config;if("function"==typeof e){const n=e(t);if("string"==typeof n)return n}}getFallbackValue(t){return Object.values(this.langs).find(e=>e[t])?.[t]}makeSafe(t){const e={"{":String.raw`\{`,"}":String.raw`\}`,"|":String.raw`\|`},n=t.replaceAll(/[{}|]/g,t=>e[t]);return new RegExp(n,"g")}put(t,e,n){let s;return s=void 0===n?this.current||(this.langs[this.locale]??={}):this.langs[n]??={},s[t]=e,e}get(t,e,n=this.locale){const s=Boolean(this.config.fallbackLocale);let l=this.getValue(t,n);if(!a(l,s)){const s=(t=>"number"==typeof t?t:t&&"object"==typeof t&&"number"==typeof t.count?t.count:void 0)(e);l=void 0===s?void 0:this.getPluralValue(t,s,n)}if(!a(l,s))return this.handleMissing({key:t,locale:n,type:"key"});if(!e&&0!==e)return l;const i=l.match(/\{[^}]+?\}/g);if(!i)return l;if("object"==typeof e)for(const a of i){const s=a.slice(1,-1);let i=e[s];null==i&&(i=this.handleMissing({key:t,locale:n,type:"arg",arg:s})??""),l=l.replace(this.makeSafe(a),i)}else l=l.replaceAll(/\{[^}]+?\}/g,e);return l}t(t,e,n){const s=this.get(t,e,n);return void 0===s?t:s}forLocale(t){return(e,n)=>this.t(e,n,t)}static processFile(t){return r.fromFile(t)}static fromFile(t){const e=String(t).replaceAll("\r\n","\n").split("\n"),n={},s=/^(.+?) *?= *?([^\n]+)/,l=t=>{const e=s.exec(t),l=e?.[1].trim();l&&(n[l]=e[2].trim())};let a=null;for(const i of e){let t=i;if(null!==a)t=a+i.trimStart(),a=null;else if(/^\s*[#;]/.test(i))continue;/(^|[^\\])\\$/.test(t)?a=t.slice(0,-1):l(t)}return null!==a&&l(a),n}static parse(t){return r.processFile(t)}static getInstance(e){return n||(n=new t(e)),n}static resetInstance(){n=null}async loadLang(e,n=!0){if(this.loaded.includes(e)&&n)return this.langs[e];const s=`${this.config.location}${e}${this.config.extension}`;try{const n=await async function(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e[t.endsWith(".lang")?"text":"json"]()}catch(e){throw e}}(s),l="string"==typeof n?t.processFile(n):n;return this.applyLanguage(e,l),this.langs[e]}catch(l){return this.applyLanguage(e)}}applyLanguage(t,e={}){const n=this.config.override[t]||{},s=this.langs[t]||{};return this.langs[t]={...s,...e,...n},this.current&&t===this.locale&&(this.current=this.langs[t]),l(this.loaded,t),this.langs[t]}get getLangs(){return this.config.langs}async setCurrent(t="en-US"){return this.loaded.includes(t)||await this.loadLang(t),this.locale=t,this.current=this.langs[t],this.current}},{apply:(t,e,n)=>t.getInstance(...n),construct:(t,e)=>new t(...e),get:(t,e)=>t[e]}),c=r.getInstance();return t.I18N=r,t.default=c,t}({});
9
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5paWZlLm1pbi5qcyIsIm5hbWVzIjpbImkxOG4iLCJleHBvcnRzIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydGllcyIsIl9fZXNNb2R1bGUiLCJ2YWx1ZSIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiZnJlZXplIiwibWV0aG9kIiwiYm9keSIsIkRFRkFVTFRfQ09ORklHIiwiZXh0ZW5zaW9uIiwibG9jYXRpb24iLCJsYW5ncyIsImxvY2FsZSIsIm92ZXJyaWRlIiwiaW5zdGFuY2UiLCJoYXNPd24iLCJvYmoiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJwdXNoVW5pcXVlIiwiYXJyIiwiaXRlbSIsIkFycmF5IiwiaXNBcnJheSIsImluY2x1ZGVzIiwicHVzaCIsImlzUHJlc2VudCIsInN0cmljdCIsIkJvb2xlYW4iLCJwbHVyYWxSdWxlc0NhY2hlIiwiTWFwIiwiZ2V0UGx1cmFsU3VmZml4ZXMiLCJjb3VudCIsInN1ZmZpeGVzIiwiU2V0IiwiYWRkIiwiYmFzaWNDYXRlZ29yeSIsIkludGwiLCJQbHVyYWxSdWxlcyIsImhhcyIsInJ1bGVzIiwiU3RyaW5nIiwicmVwbGFjZUFsbCIsInNldCIsImdldCIsInNlbGVjdCIsImdldFBsdXJhbENhdGVnb3J5IiwiSTE4TiIsIlByb3h5IiwiSTE4TkJhc2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJ0aGlzIiwiY3JlYXRlIiwibG9hZGVkIiwicHJvY2Vzc0NvbmZpZyIsInJlc3RPcHRpb25zIiwicGFyc2VkTG9jYXRpb24iLCJlbmRzV2l0aCIsImNvbmZpZyIsInByZWxvYWRlZCIsImFsbExvY2FsZXMiLCJrZXlzIiwibWVyZ2VkTGFuZyIsImFwcGx5TGFuZ3VhZ2UiLCJpbml0IiwiZmFsbGJhY2tzIiwiZ2V0RmFsbGJhY2tMb2NhbGVzIiwiZmlsdGVyIiwibGVuZ3RoIiwiUHJvbWlzZSIsImFsbCIsInNldEN1cnJlbnQiLCJtYXAiLCJsb2FkTGFuZyIsInRoZW4iLCJjdXJyZW50IiwiYWRkTGFuZ3VhZ2UiLCJsYW5nIiwicHJvY2Vzc0ZpbGUiLCJmYWxsYmFja0xvY2FsZSIsImNvbmNhdCIsImdldExvY2FsZUNoYWluIiwiY2hhaW4iLCJiYXNlTG9jYWxlIiwic3BsaXQiLCJnZXRWYWx1ZSIsImdldEZhbGxiYWNrVmFsdWUiLCJjaGFpbkxvY2FsZSIsImdldFBsdXJhbFZhbHVlIiwibG9jYWxlcyIsInBsdXJhbExvY2FsZSIsInN1ZmZpeCIsInBsdXJhbEtleSIsImhhbmRsZU1pc3NpbmciLCJpbmZvIiwib25NaXNzaW5nIiwicmVzdWx0IiwidmFsdWVzIiwiZmluZCIsIm1ha2VTYWZlIiwic3RyIiwibWFwT2JqIiwicmF3IiwiZXNjYXBlZFN0ciIsIm1hdGNoZWQiLCJSZWdFeHAiLCJwdXQiLCJzdHJpbmciLCJhcmdzIiwiZ2V0Q291bnQiLCJ0eXBlIiwidG9rZW5zIiwibWF0Y2giLCJ0b2tlbiIsInRva2VuS2V5Iiwic2xpY2UiLCJyZXBsYWNlbWVudCIsImFyZyIsInJlcGxhY2UiLCJ0IiwiZm9yTG9jYWxlIiwicmVzcG9uc2UiLCJmcm9tRmlsZSIsInJhd1RleHQiLCJsaW5lcyIsInJlZ2V4IiwicGFyc2VMaW5lIiwibGluZSIsIm1hdGNoZXMiLCJleGVjIiwidHJpbSIsImNvbnRpbnVlZCIsImxvZ2ljYWxMaW5lIiwidHJpbVN0YXJ0IiwidGVzdCIsInBhcnNlIiwidGV4dCIsImdldEluc3RhbmNlIiwicmVzZXRJbnN0YW5jZSIsInVzZUNhY2hlIiwibGFuZ0ZpbGUiLCJhc3luYyIsInVybCIsImZldGNoIiwib2siLCJFcnJvciIsInN0YXR1cyIsImVycm9yIiwiZmV0Y2hEYXRhIiwicHJvY2Vzc2VkRmlsZSIsImVyciIsImV4aXN0aW5nTGFuZyIsImdldExhbmdzIiwiYXBwbHkiLCJ0YXJnZXQiLCJ0aGlzQXJnIiwiY29uc3RydWN0IiwicHJvcCIsIm1pMThuX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2ZldGNoLmpzIiwiLi4vc3JjL21pMThuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGRlZmF1bHRPcHRpb25zID0gT2JqZWN0LmZyZWV6ZSh7IG1ldGhvZDogJ0dFVCcsIGJvZHk6ICcnIH0pXG4vKipcbiAqIEZldGNoZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBuZXR3b3JrLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGZldGNoLlxuICogQHBhcmFtIHtPYmplY3R9IFtmZXRjaE9wdGlvbnM9e31dIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBmZXRjaCByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtmZXRjaE9wdGlvbnMuaGVhZGVyc10gLSBIZWFkZXJzIHRvIGluY2x1ZGUgaW4gdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZldGNoT3B0aW9ucy5tZXRob2RdIC0gVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSAoZS5nLiwgJ0dFVCcsICdQT1NUJykuXG4gKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IFtmZXRjaE9wdGlvbnMuYm9keV0gLSBUaGUgYm9keSBvZiB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3BvbnNlIG9iamVjdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHJldHVybi5vayAtIEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc3RhdHVzIGlzIGluIHRoZSByYW5nZSAyMDAtMjk5LlxuICogQHJldHVybiB7bnVtYmVyfSByZXR1cm4uc3RhdHVzIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm4uc3RhdHVzVGV4dCAtIFRoZSBIVFRQIHN0YXR1cyBtZXNzYWdlIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge01hcDxzdHJpbmcsIHN0cmluZz59IHJldHVybi5oZWFkZXJzIC0gVGhlIGhlYWRlcnMgb2YgdGhlIHJlc3BvbnNlLlxuICogQHJldHVybiB7QnVmZmVyfSByZXR1cm4uYm9keSAtIFRoZSBib2R5IG9mIHRoZSByZXNwb25zZSBhcyBhIEJ1ZmZlci5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IFByb21pc2U8QnVmZmVyPn0gcmV0dXJuLmFycmF5QnVmZmVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgYm9keSBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IFByb21pc2U8T2JqZWN0Pn0gcmV0dXJuLmpzb24gLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBib2R5IHBhcnNlZCBhcyBKU09OLlxuICovXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEodXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXIgPSB1cmwuZW5kc1dpdGgoJy5sYW5nJykgPyAndGV4dCcgOiAnanNvbidcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2VbaGFuZGxlcl0oKVxuICAgIHJldHVybiBkYXRhXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignVGhlcmUgaGFzIGJlZW4gYSBwcm9ibGVtIHdpdGggeW91ciBmZXRjaCBvcGVyYXRpb246JywgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmV0Y2hEYXRhIH0gZnJvbSAnLi9mZXRjaC5qcydcblxuY29uc3QgREVGQVVMVF9DT05GSUcgPSB7XG4gIGV4dGVuc2lvbjogJy5sYW5nJyxcbiAgLy8gbG9jYWwgb3IgcmVtb3RlIGRpcmVjdG9yeSBjb250YWluaW5nIGxhbmd1YWdlIGZpbGVzXG4gIGxvY2F0aW9uOiAnYXNzZXRzL2xhbmcvJyxcbiAgLy8gbGlzdCBvZiBhdmFpbGFibGUgbG9jYWxlcywgaGFuZHkgZm9yIHBvcHVsYXRpbmcgc2VsZWN0b3IuXG4gIGxhbmdzOiBbJ2VuLVVTJ10sXG4gIGxvY2FsZTogJ2VuLVVTJywgLy8gaW5pdCB3aXRoIHVzZXIncyBwcmVmZXJyZWQgbGFuZ3VhZ2VcbiAgb3ZlcnJpZGU6IHt9LFxufVxuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2UgaG9sZGVyXG5sZXQgaW5zdGFuY2UgPSBudWxsXG5cbmNvbnN0IGhhc093biA9IChvYmosIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxuXG4vKipcbiAqIEFkZCBhbiBpdGVtIHRvIGFuIGFycmF5IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGFyclxuICogQHBhcmFtIHsqfSBpdGVtXG4gKi9cbmNvbnN0IHB1c2hVbmlxdWUgPSAoYXJyLCBpdGVtKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikgJiYgIWFyci5pbmNsdWRlcyhpdGVtKSkge1xuICAgIGFyci5wdXNoKGl0ZW0pXG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgbG9va2VkIHVwIHZhbHVlIGNvdW50cyBhcyBwcmVzZW50LlxuICogTGVnYWN5IGxvb2t1cHMgdHJlYXQgZW1wdHkgc3RyaW5ncyBhcyBtaXNzaW5nLCBmYWxsYmFja0xvY2FsZSBsb29rdXBzIGRvIG5vdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RyaWN0IHRydWUgd2hlbiBmYWxsYmFja0xvY2FsZSBpcyBjb25maWd1cmVkXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5jb25zdCBpc1ByZXNlbnQgPSAodmFsdWUsIHN0cmljdCkgPT4gKHN0cmljdCA/IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgOiBCb29sZWFuKHZhbHVlKSlcblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBwbHVyYWwgY291bnQgZnJvbSBnZXQvdCBhcmdzXG4gKiBAcGFyYW0geyp9IGFyZ3NcbiAqIEByZXR1cm4ge051bWJlcnx1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGdldENvdW50ID0gYXJncyA9PiB7XG4gIGlmICh0eXBlb2YgYXJncyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYXJnc1xuICB9XG4gIGlmIChhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYXJncy5jb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYXJncy5jb3VudFxuICB9XG59XG5cbmNvbnN0IHBsdXJhbFJ1bGVzQ2FjaGUgPSBuZXcgTWFwKClcblxuLyoqXG4gKiBHZXQgdGhlIENMRFIgcGx1cmFsIGNhdGVnb3J5IGZvciBhIGNvdW50IGluIGEgbG9jYWxlXG4gKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnRcbiAqIEByZXR1cm4ge1N0cmluZ30gcGx1cmFsIGNhdGVnb3J5LCBlZy4gJ29uZScsICdmZXcnLCAnb3RoZXInXG4gKi9cbmNvbnN0IGdldFBsdXJhbENhdGVnb3J5ID0gKGxvY2FsZSwgY291bnQpID0+IHtcbiAgY29uc3QgYmFzaWNDYXRlZ29yeSA9IGNvdW50ID09PSAxID8gJ29uZScgOiAnb3RoZXInXG4gIGlmICh0eXBlb2YgSW50bCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIEludGwuUGx1cmFsUnVsZXMgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmFzaWNDYXRlZ29yeVxuICB9XG4gIGlmICghcGx1cmFsUnVsZXNDYWNoZS5oYXMobG9jYWxlKSkge1xuICAgIGxldCBydWxlcyA9IG51bGxcbiAgICB0cnkge1xuICAgICAgcnVsZXMgPSBuZXcgSW50bC5QbHVyYWxSdWxlcyhTdHJpbmcobG9jYWxlKS5yZXBsYWNlQWxsKCdfJywgJy0nKSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGludmFsaWQgbG9jYWxlIHRhZ1xuICAgIH1cbiAgICBwbHVyYWxSdWxlc0NhY2hlLnNldChsb2NhbGUsIHJ1bGVzKVxuICB9XG4gIGNvbnN0IHJ1bGVzID0gcGx1cmFsUnVsZXNDYWNoZS5nZXQobG9jYWxlKVxuICByZXR1cm4gcnVsZXMgPyBydWxlcy5zZWxlY3QoY291bnQpIDogYmFzaWNDYXRlZ29yeVxufVxuXG4vKipcbiAqIFBsdXJhbCBrZXkgc3VmZml4ZXMgdG8gdHJ5LCBpbiBvcmRlclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxlXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAqL1xuY29uc3QgZ2V0UGx1cmFsU3VmZml4ZXMgPSAoY291bnQsIGxvY2FsZSkgPT4ge1xuICBjb25zdCBzdWZmaXhlcyA9IG5ldyBTZXQoKVxuICBpZiAoY291bnQgPT09IDApIHtcbiAgICBzdWZmaXhlcy5hZGQoJ3plcm8nKVxuICB9XG4gIHN1ZmZpeGVzLmFkZChnZXRQbHVyYWxDYXRlZ29yeShsb2NhbGUsIGNvdW50KSlcbiAgc3VmZml4ZXMuYWRkKCdvdGhlcicpXG4gIHJldHVybiBbLi4uc3VmZml4ZXNdXG59XG5cbi8qKlxuICogTWFpbiBpMThuIGNsYXNzXG4gKiBAY2xhc3MgSTE4TkJhc2VcbiAqIEBjbGFzc2Rlc2MgbWV0aG9kcyBhbmQgZGF0YSBzdG9yZSBmb3IgaTE4blxuICovXG5jbGFzcyBJMThOQmFzZSB7XG4gIC8qKlxuICAgKiBQcm9jZXNzIG9wdGlvbnMgYW5kIHN0YXJ0IHRoZSBtb2R1bGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSBERUZBVUxUX0NPTkZJRykge1xuICAgIHRoaXMubGFuZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5sb2FkZWQgPSBbXVxuICAgIHRoaXMucHJvY2Vzc0NvbmZpZyhvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIHBhcnNlIGFuZCBmb3JtYXQgY29uZmlnXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBwcm9jZXNzQ29uZmlnKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGxvY2F0aW9uLCAuLi5yZXN0T3B0aW9ucyB9ID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4ub3B0aW9ucyB9XG4gICAgLy8gRW5zdXJlIGxvY2F0aW9uIGVuZHMgd2l0aCBhIHNsYXNoXG4gICAgY29uc3QgcGFyc2VkTG9jYXRpb24gPSBsb2NhdGlvbi5lbmRzV2l0aCgnLycpID8gbG9jYXRpb24gOiBgJHtsb2NhdGlvbn0vYFxuICAgIC8vIENvcHkgbGFuZ3Mgc28gdGhlIGRlZmF1bHRzIGFuZCB1c2VyIHN1cHBsaWVkIGFycmF5cyBhcmUgbmV2ZXIgbXV0YXRlZFxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3RPcHRpb25zLmxhbmdzKSkge1xuICAgICAgcmVzdE9wdGlvbnMubGFuZ3MgPSBbLi4ubmV3IFNldChyZXN0T3B0aW9ucy5sYW5ncyldXG4gICAgfVxuICAgIHRoaXMuY29uZmlnID0geyBsb2NhdGlvbjogcGFyc2VkTG9jYXRpb24sIC4uLnJlc3RPcHRpb25zIH1cblxuICAgIGNvbnN0IHsgcHJlbG9hZGVkID0ge30sIG92ZXJyaWRlID0ge30gfSA9IHRoaXMuY29uZmlnXG5cbiAgICAvLyBNZXJnZSBsb2NhbGVzIGZyb20gYm90aCBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlXG4gICAgLy8gVGhpcyBzdXBwb3J0cyBsZWdhY3kgdXNhZ2Ugd2hlcmUgb3ZlcnJpZGUgZGVmaW5lZCBlbnRpcmUgbGFuZ3VhZ2VzXG4gICAgY29uc3QgYWxsTG9jYWxlcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKHByZWxvYWRlZCksIC4uLk9iamVjdC5rZXlzKG92ZXJyaWRlKV0pXG5cbiAgICAvLyBBcHBseSBsYW5ndWFnZXMgZnJvbSBib3RoIHByZWxvYWRlZCBhbmQgb3ZlcnJpZGVcbiAgICAvLyBhcHBseUxhbmd1YWdlIHdpbGwgbWVyZ2UgdGhlbSBwcm9wZXJseSAoZXhpc3RpbmcgKyBwcmVsb2FkZWQgKyBvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBhbGxMb2NhbGVzKSB7XG4gICAgICBjb25zdCBwcmVsb2FkZWRMYW5nID0gcHJlbG9hZGVkW2xvY2FsZV0gfHwge31cbiAgICAgIGNvbnN0IG92ZXJyaWRlTGFuZyA9IG92ZXJyaWRlW2xvY2FsZV0gfHwge31cbiAgICAgIC8vIE1lcmdlIHByZWxvYWRlZCBhbmQgb3ZlcnJpZGUgZm9yIHRoaXMgbG9jYWxlXG4gICAgICBjb25zdCBtZXJnZWRMYW5nID0geyAuLi5wcmVsb2FkZWRMYW5nLCAuLi5vdmVycmlkZUxhbmcgfVxuICAgICAgdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSwgbWVyZ2VkTGFuZylcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuY29uZmlnLmxvY2FsZSB8fCB0aGlzLmNvbmZpZy5sYW5nc1swXVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbGFuZ3VhZ2UgYW5kIHNldCBkZWZhdWx0XG4gICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICAgcmVzb2x2ZXMgbGFuZ3VhZ2VcbiAgICovXG4gIGluaXQob3B0aW9ucykge1xuICAgIHRoaXMucHJvY2Vzc0NvbmZpZyh7IC4uLnRoaXMuY29uZmlnLCAuLi5vcHRpb25zIH0pXG4gICAgLy8gRmFsbGJhY2sgbG9jYWxlcyBhcmUgbG9hZGVkIGFsb25nc2lkZSB0aGUgY3VycmVudCBsb2NhbGUgc28gbG9va3VwcyBjYW4gZmFsbCBiYWNrIHRvIHRoZW1cbiAgICBjb25zdCBmYWxsYmFja3MgPSB0aGlzLmdldEZhbGxiYWNrTG9jYWxlcygpLmZpbHRlcihsb2NhbGUgPT4gIXRoaXMubG9hZGVkLmluY2x1ZGVzKGxvY2FsZSkpXG4gICAgaWYgKCFmYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRDdXJyZW50KHRoaXMubG9jYWxlKVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuc2V0Q3VycmVudCh0aGlzLmxvY2FsZSksIC4uLmZhbGxiYWNrcy5tYXAobG9jYWxlID0+IHRoaXMubG9hZExhbmcobG9jYWxlKSldKS50aGVuKFxuICAgICAgKFtjdXJyZW50XSkgPT4gY3VycmVudCxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGxhbmd1YWdlIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGxhbmdcbiAgICovXG4gIGFkZExhbmd1YWdlKGxvY2FsZSwgbGFuZyA9IHt9KSB7XG4gICAgbGFuZyA9IHR5cGVvZiBsYW5nID09PSAnc3RyaW5nJyA/IEkxOE5CYXNlLnByb2Nlc3NGaWxlKGxhbmcpIDogbGFuZ1xuICAgIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUsIGxhbmcpXG4gICAgcHVzaFVuaXF1ZSh0aGlzLmxvYWRlZCwgbG9jYWxlKVxuICAgIHB1c2hVbmlxdWUodGhpcy5jb25maWcubGFuZ3MsIGxvY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVkIGZhbGxiYWNrIGxvY2FsZXNcbiAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAqL1xuICBnZXRGYWxsYmFja0xvY2FsZXMoKSB7XG4gICAgY29uc3QgeyBmYWxsYmFja0xvY2FsZSB9ID0gdGhpcy5jb25maWdcbiAgICByZXR1cm4gW10uY29uY2F0KGZhbGxiYWNrTG9jYWxlID8/IFtdKS5maWx0ZXIobG9jYWxlID0+IHR5cGVvZiBsb2NhbGUgPT09ICdzdHJpbmcnICYmIGxvY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NhbGVzIGNoZWNrZWQsIGluIG9yZGVyLCB3aGVuIGxvb2tpbmcgdXAgYSBrZXkgd2l0aCBmYWxsYmFja0xvY2FsZSBjb25maWd1cmVkOlxuICAgKiByZXF1ZXN0ZWQgbG9jYWxlLCBpdHMgYmFzZSBsYW5ndWFnZSAoaWYgbG9hZGVkKSwgdGhlbiBlYWNoIGZhbGxiYWNrIGxvY2FsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICovXG4gIGdldExvY2FsZUNoYWluKGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgY29uc3QgY2hhaW4gPSBbbG9jYWxlXVxuICAgIGNvbnN0IGJhc2VMb2NhbGUgPSBTdHJpbmcobG9jYWxlKS5zcGxpdCgvWy1fXS8pWzBdXG4gICAgaWYgKGJhc2VMb2NhbGUgJiYgdGhpcy5sYW5nc1tiYXNlTG9jYWxlXSkge1xuICAgICAgY2hhaW4ucHVzaChiYXNlTG9jYWxlKVxuICAgIH1cbiAgICBjaGFpbi5wdXNoKC4uLnRoaXMuZ2V0RmFsbGJhY2tMb2NhbGVzKCkpXG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KGNoYWluKV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYSBzdHJpbmcgZnJvbSBhIGxvYWRlZCBsYW5ndWFnZSBmaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5ICAtIHRoZSBrZXkgZm9yIHRoZSBzdHJpbmcgd2UgYXJlIHRyeWluZyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZSAtIGxvY2FsZSB0byBjaGVjayBmb3IgdmFsdWVcbiAgICogQHJldHVybiB7U3RyaW5nfSBsYW5ndWFnZSBzdHJpbmcgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRWYWx1ZShrZXksIGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmZhbGxiYWNrTG9jYWxlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYWluTG9jYWxlIG9mIHRoaXMuZ2V0TG9jYWxlQ2hhaW4obG9jYWxlKSkge1xuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nc1tjaGFpbkxvY2FsZV1cbiAgICAgICAgaWYgKGxhbmcgJiYgaGFzT3duKGxhbmcsIGtleSkgJiYgaXNQcmVzZW50KGxhbmdba2V5XSwgdHJ1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbGFuZ1trZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5sYW5nc1tsb2NhbGVdPy5ba2V5XVxuICAgIHJldHVybiB2YWx1ZSB8fCB0aGlzLmdldEZhbGxiYWNrVmFsdWUoa2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBwbHVyYWwgZm9ybSBvZiBrZXksIGVnLiBga2V5Lnplcm9gLCBga2V5Lm9uZWAsIGBrZXkub3RoZXJgXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSAge051bWJlcn0gY291bnRcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHJldHVybiB7U3RyaW5nfSBwbHVyYWwgc3RyaW5nIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0UGx1cmFsVmFsdWUoa2V5LCBjb3VudCwgbG9jYWxlID0gdGhpcy5sb2NhbGUpIHtcbiAgICBjb25zdCBzdHJpY3QgPSBCb29sZWFuKHRoaXMuY29uZmlnLmZhbGxiYWNrTG9jYWxlKVxuICAgIGNvbnN0IGxvY2FsZXMgPSBzdHJpY3QgPyB0aGlzLmdldExvY2FsZUNoYWluKGxvY2FsZSkgOiBuZXcgU2V0KFtsb2NhbGUsIC4uLk9iamVjdC5rZXlzKHRoaXMubGFuZ3MpXSlcblxuICAgIGZvciAoY29uc3QgcGx1cmFsTG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmdzW3BsdXJhbExvY2FsZV1cbiAgICAgIGlmICghbGFuZykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBzdWZmaXggb2YgZ2V0UGx1cmFsU3VmZml4ZXMoY291bnQsIHBsdXJhbExvY2FsZSkpIHtcbiAgICAgICAgY29uc3QgcGx1cmFsS2V5ID0gYCR7a2V5fS4ke3N1ZmZpeH1gXG4gICAgICAgIGlmIChoYXNPd24obGFuZywgcGx1cmFsS2V5KSAmJiBpc1ByZXNlbnQobGFuZ1twbHVyYWxLZXldLCBzdHJpY3QpKSB7XG4gICAgICAgICAgcmV0dXJuIGxhbmdbcGx1cmFsS2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBhIG1pc3Npbmcga2V5IG9yIGFyZ3VtZW50IHRvIHRoZSBvbk1pc3NpbmcgaGFuZGxlclxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGluZm8geyBrZXksIGxvY2FsZSwgdHlwZSwgYXJnIH1cbiAgICogQHJldHVybiB7U3RyaW5nfSByZXBsYWNlbWVudCBzdHJpbmcgcmV0dXJuZWQgYnkgb25NaXNzaW5nIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgaGFuZGxlTWlzc2luZyhpbmZvKSB7XG4gICAgY29uc3QgeyBvbk1pc3NpbmcgfSA9IHRoaXMuY29uZmlnXG4gICAgaWYgKHR5cGVvZiBvbk1pc3NpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9uTWlzc2luZyhpbmZvKVxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIGxhbmd1YWdlIHRoYXQgaGFzIGRlc2lyZWQga2V5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdmFsdWUga2V5XG4gICAqIEByZXR1cm4ge1N0cmluZ30gZm91bmQgdmFsdWUgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRGYWxsYmFja1ZhbHVlKGtleSkge1xuICAgIGNvbnN0IGZhbGxiYWNrTGFuZyA9IE9iamVjdC52YWx1ZXModGhpcy5sYW5ncykuZmluZChsYW5nID0+IGxhbmdba2V5XSlcbiAgICByZXR1cm4gZmFsbGJhY2tMYW5nPy5ba2V5XVxuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZSB2YXJpYWJsZSBzeW50YXhcbiAgICogQHBhcmFtICB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgZXNjYXBlZCBzdHJcbiAgICovXG4gIG1ha2VTYWZlKHN0cikge1xuICAgIGNvbnN0IG1hcE9iaiA9IHtcbiAgICAgICd7JzogU3RyaW5nLnJhd2BcXHtgLFxuICAgICAgJ30nOiBTdHJpbmcucmF3YFxcfWAsXG4gICAgICAnfCc6IFN0cmluZy5yYXdgXFx8YCxcbiAgICB9XG5cbiAgICBjb25zdCBlc2NhcGVkU3RyID0gc3RyLnJlcGxhY2VBbGwoL1t7fXxdL2csIG1hdGNoZWQgPT4gbWFwT2JqW21hdGNoZWRdKVxuXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoZXNjYXBlZFN0ciwgJ2cnKVxuICB9XG5cbiAgLyoqXG4gICAqIFRlbXBvcmFyaWx5IHB1dCBhIHN0cmluZyBpbnRvIHRoZSBjdXJyZW50bHkgbG9hZGVkIGxhbmd1YWdlLCBvciB0aGUgZ2l2ZW4gbG9jYWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSAge1N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlIG9wdGlvbmFsIGxvY2FsZSB0byB3cml0ZSB0b1xuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyBpbiBjdXJyZW50IGxhbmd1YWdlXG4gICAqL1xuICBwdXQoa2V5LCBzdHJpbmcsIGxvY2FsZSkge1xuICAgIGxldCBsYW5nXG4gICAgaWYgKGxvY2FsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYW5nID0gdGhpcy5jdXJyZW50IHx8ICh0aGlzLmxhbmdzW3RoaXMubG9jYWxlXSA/Pz0ge30pXG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbmcgPSB0aGlzLmxhbmdzW2xvY2FsZV0gPz89IHt9XG4gICAgfVxuICAgIGxhbmdba2V5XSA9IHN0cmluZ1xuXG4gICAgcmV0dXJuIHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFyZ3VtZW50cyBmb3IgdGhlIHJlcXVlc3RlZCBzdHJpbmdcbiAgICogQHBhcmFtICB7U3RyaW5nfSBrZXkgIHRoZSBrZXkgd2UgdXNlIHRvIGxvb2t1cCBvdXIgdHJhbnNsYXRpb25cbiAgICogQHBhcmFtICB7bXVsdGl9ICBhcmdzICBzdHJpbmcsIG51bWJlciBvciBvYmplY3QgY29udGFpbmluZyBvdXIgYXJndW1lbnRzXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlIG9wdGlvbmFsIGxvY2FsZSwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgbG9jYWxlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgICB1cGRhdGVkIHN0cmluZyB0cmFuc2xhdGlvblxuICAgKi9cbiAgZ2V0KGtleSwgYXJncywgbG9jYWxlID0gdGhpcy5sb2NhbGUpIHtcbiAgICBjb25zdCBzdHJpY3QgPSBCb29sZWFuKHRoaXMuY29uZmlnLmZhbGxiYWNrTG9jYWxlKVxuICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoa2V5LCBsb2NhbGUpXG5cbiAgICBpZiAoIWlzUHJlc2VudCh2YWx1ZSwgc3RyaWN0KSkge1xuICAgICAgY29uc3QgY291bnQgPSBnZXRDb3VudChhcmdzKVxuICAgICAgdmFsdWUgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5nZXRQbHVyYWxWYWx1ZShrZXksIGNvdW50LCBsb2NhbGUpXG4gICAgfVxuXG4gICAgaWYgKCFpc1ByZXNlbnQodmFsdWUsIHN0cmljdCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZU1pc3NpbmcoeyBrZXksIGxvY2FsZSwgdHlwZTogJ2tleScgfSlcbiAgICB9XG5cbiAgICAvLyBObyByZXBsYWNlbWVudCBuZWVkZWQgaWYgbm8gYXJncyBwcm92aWRlZFxuICAgIGlmICghYXJncyAmJiBhcmdzICE9PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSB2YWx1ZS5tYXRjaCgvXFx7W159XSs/XFx9L2cpXG5cbiAgICAvLyBObyB0b2tlbnMgdG8gcmVwbGFjZVxuICAgIGlmICghdG9rZW5zKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICAvLyBPYmplY3QgYXJnczogcmVwbGFjZSBlYWNoIHRva2VuIHdpdGggY29ycmVzcG9uZGluZyBrZXlcbiAgICBpZiAodHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBjb25zdCB0b2tlbktleSA9IHRva2VuLnNsaWNlKDEsIC0xKVxuICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSBhcmdzW3Rva2VuS2V5XVxuICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCB8fCByZXBsYWNlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gdGhpcy5oYW5kbGVNaXNzaW5nKHsga2V5LCBsb2NhbGUsIHR5cGU6ICdhcmcnLCBhcmc6IHRva2VuS2V5IH0pID8/ICcnXG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHRoaXMubWFrZVNhZmUodG9rZW4pLCByZXBsYWNlbWVudClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUHJpbWl0aXZlIGFyZ3M6IHJlcGxhY2UgYWxsIHRva2VucyB3aXRoIHNhbWUgdmFsdWVcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgvXFx7W159XSs/XFx9L2csIGFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTGlrZSBnZXQoKSBidXQgYWx3YXlzIHJldHVybnMgYSBzdHJpbmcsIGZhbGxpbmcgYmFjayB0byB0aGUga2V5IGl0c2VsZlxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSAgdGhlIGtleSB3ZSB1c2UgdG8gbG9va3VwIG91ciB0cmFuc2xhdGlvblxuICAgKiBAcGFyYW0gIHttdWx0aX0gIGFyZ3MgIHN0cmluZywgbnVtYmVyIG9yIG9iamVjdCBjb250YWluaW5nIG91ciBhcmd1bWVudHNcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGUgb3B0aW9uYWwgbG9jYWxlLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBsb2NhbGVcbiAgICogQHJldHVybiB7U3RyaW5nfSB0cmFuc2xhdGVkIHN0cmluZyBvciBrZXlcbiAgICovXG4gIHQoa2V5LCBhcmdzLCBsb2NhbGUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGtleSwgYXJncywgbG9jYWxlKVxuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8ga2V5IDogdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2xhdGUgZnVuY3Rpb24gYm91bmQgdG8gYSBsb2NhbGVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHJldHVybiB7RnVuY3Rpb259IChrZXksIGFyZ3MpID0+IHN0cmluZ1xuICAgKi9cbiAgZm9yTG9jYWxlKGxvY2FsZSkge1xuICAgIHJldHVybiAoa2V5LCBhcmdzKSA9PiB0aGlzLnQoa2V5LCBhcmdzLCBsb2NhbGUpXG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZDogUHJvY2VzcyBhIGxhbmd1YWdlIGZpbGUgZnJvbSByYXcgdGV4dFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHJlc3BvbnNlXG4gICAqIEByZXR1cm4ge09iamVjdH0gcHJvY2Vzc2VkIGxhbmd1YWdlXG4gICAqL1xuICBzdGF0aWMgcHJvY2Vzc0ZpbGUocmVzcG9uc2UpIHtcbiAgICAvLyBibGFuayBsaW5lcyBhcmUgaWdub3JlZCBieSBmcm9tRmlsZVxuICAgIHJldHVybiBJMThOLmZyb21GaWxlKHJlc3BvbnNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2Q6IFR1cm4gcmF3IHRleHQgZnJvbSB0aGUgbGFuZ3VhZ2UgZmlsZXMgaW50byBmYW5jeSBKU09OXG4gICAqIFN1cHBvcnRzIGAjYCBhbmQgYDtgIGZ1bGwtbGluZSBjb21tZW50cyBhbmQgdHJhaWxpbmcgYFxcYCBsaW5lIGNvbnRpbnVhdGlvblxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHJhd1RleHRcbiAgICogQHJldHVybiB7T2JqZWN0fSBjb252ZXJ0ZWQgbGFuZ3VhZ2UgZmlsZVxuICAgKi9cbiAgc3RhdGljIGZyb21GaWxlKHJhd1RleHQpIHtcbiAgICBjb25zdCBsaW5lcyA9IFN0cmluZyhyYXdUZXh0KS5yZXBsYWNlQWxsKCdcXHJcXG4nLCAnXFxuJykuc3BsaXQoJ1xcbicpXG4gICAgY29uc3QgbGFuZyA9IHt9XG4gICAgY29uc3QgcmVnZXggPSAvXiguKz8pICo/PSAqPyhbXlxcbl0rKS9cbiAgICBjb25zdCBwYXJzZUxpbmUgPSBsaW5lID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSByZWdleC5leGVjKGxpbmUpXG4gICAgICBjb25zdCBrZXkgPSBtYXRjaGVzPy5bMV0udHJpbSgpXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGxhbmdba2V5XSA9IG1hdGNoZXNbMl0udHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGNvbnRpbnVlZCA9IG51bGxcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGxldCBsb2dpY2FsTGluZSA9IGxpbmVcbiAgICAgIGlmIChjb250aW51ZWQgIT09IG51bGwpIHtcbiAgICAgICAgbG9naWNhbExpbmUgPSBjb250aW51ZWQgKyBsaW5lLnRyaW1TdGFydCgpXG4gICAgICAgIGNvbnRpbnVlZCA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoL15cXHMqWyM7XS8udGVzdChsaW5lKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBhIHNpbmdsZSB0cmFpbGluZyBiYWNrc2xhc2ggam9pbnMgdGhlIG5leHQgbGluZVxuICAgICAgaWYgKC8oXnxbXlxcXFxdKVxcXFwkLy50ZXN0KGxvZ2ljYWxMaW5lKSkge1xuICAgICAgICBjb250aW51ZWQgPSBsb2dpY2FsTGluZS5zbGljZSgwLCAtMSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcGFyc2VMaW5lKGxvZ2ljYWxMaW5lKVxuICAgIH1cblxuICAgIGlmIChjb250aW51ZWQgIT09IG51bGwpIHtcbiAgICAgIHBhcnNlTGluZShjb250aW51ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kOiBQYXJzZSB0aGUgY29udGVudHMgb2YgYSBgLmxhbmdgIGZpbGUsIGFsaWFzIG9mIHByb2Nlc3NGaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gdGV4dFxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb2Nlc3NlZCBsYW5ndWFnZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlKHRleHQpIHtcbiAgICByZXR1cm4gSTE4Ti5wcm9jZXNzRmlsZSh0ZXh0KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge0kxOE5CYXNlfSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZShvcHRpb25zKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgSTE4TkJhc2Uob3B0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAodXNlZnVsIGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgc3RhdGljIHJlc2V0SW5zdGFuY2UoKSB7XG4gICAgaW5zdGFuY2UgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHJlbW90ZWx5IHN0b3JlZCBsYW5ndWFnZSBmaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IHVzZUNhY2hlXG4gICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICAgIHJlc29sdmVzIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBsb2FkTGFuZyhsb2NhbGUsIHVzZUNhY2hlID0gdHJ1ZSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgbGFuZ3VhZ2UgaWYgYWxyZWFkeSBsb2FkZWRcbiAgICBpZiAodGhpcy5sb2FkZWQuaW5jbHVkZXMobG9jYWxlKSAmJiB1c2VDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICAgIH1cbiAgICAvLyBGZXRjaCBhbmQgcHJvY2VzcyBsYW5ndWFnZSBmaWxlXG4gICAgY29uc3QgbGFuZ0ZpbGUgPSBgJHt0aGlzLmNvbmZpZy5sb2NhdGlvbn0ke2xvY2FsZX0ke3RoaXMuY29uZmlnLmV4dGVuc2lvbn1gXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFuZyA9IGF3YWl0IGZldGNoRGF0YShsYW5nRmlsZSlcbiAgICAgIGNvbnN0IHByb2Nlc3NlZEZpbGUgPSB0eXBlb2YgbGFuZyA9PT0gJ3N0cmluZycgPyBJMThOQmFzZS5wcm9jZXNzRmlsZShsYW5nKSA6IGxhbmdcbiAgICAgIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUsIHByb2Nlc3NlZEZpbGUpXG4gICAgICByZXR1cm4gdGhpcy5sYW5nc1tsb2NhbGVdXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5TGFuZ3VhZ2UobG9jYWxlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBhcHBsaWVzIG92ZXJyaWRlcyBmcm9tIGNvbmZpZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsYW5nXG4gICAqIEByZXR1cm4ge09iamVjdH0gb3ZlcnJpZGVuIGxhbmd1YWdlXG4gICAqL1xuICBhcHBseUxhbmd1YWdlKGxvY2FsZSwgbGFuZyA9IHt9KSB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLmNvbmZpZy5vdmVycmlkZVtsb2NhbGVdIHx8IHt9XG4gICAgY29uc3QgZXhpc3RpbmdMYW5nID0gdGhpcy5sYW5nc1tsb2NhbGVdIHx8IHt9XG4gICAgdGhpcy5sYW5nc1tsb2NhbGVdID0geyAuLi5leGlzdGluZ0xhbmcsIC4uLmxhbmcsIC4uLm92ZXJyaWRlIH1cbiAgICAvLyBrZWVwIHRoZSBjdXJyZW50IGxhbmd1YWdlIHJlZmVyZW5jZSBpbiBzeW5jXG4gICAgaWYgKHRoaXMuY3VycmVudCAmJiBsb2NhbGUgPT09IHRoaXMubG9jYWxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmxhbmdzW2xvY2FsZV1cbiAgICB9XG4gICAgcHVzaFVuaXF1ZSh0aGlzLmxvYWRlZCwgbG9jYWxlKVxuICAgIHJldHVybiB0aGlzLmxhbmdzW2xvY2FsZV1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gY3VycmVudGx5IGF2YWlsYWJsZSBsYW5ndWFnZXNcbiAgICogQHJldHVybiB7T2JqZWN0fSBhbGwgY29uZmlndXJlZCBsYW5ndWFnZXNcbiAgICovXG4gIGdldCBnZXRMYW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubGFuZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byB0aGUgbG9jYWwgcHJvdmlkZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9ICAgbG9jYWxlXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IGxhbmd1YWdlXG4gICAqL1xuICBhc3luYyBzZXRDdXJyZW50KGxvY2FsZSA9ICdlbi1VUycpIHtcbiAgICBpZiAoIXRoaXMubG9hZGVkLmluY2x1ZGVzKGxvY2FsZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExhbmcobG9jYWxlKVxuICAgIH1cblxuICAgIHRoaXMubG9jYWxlID0gbG9jYWxlXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5sYW5nc1tsb2NhbGVdXG5cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50XG4gIH1cbn1cblxuLyoqXG4gKiBQcm94eSB3cmFwcGVyIHRoYXQgZW5hYmxlcyBzaW5nbGV0b24gcGF0dGVybjpcbiAqIC0gSTE4TigpIHJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICogLSBuZXcgSTE4TigpIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IEkxOE4gPSBuZXcgUHJveHkoSTE4TkJhc2UsIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIEkxOE4oKSBpcyBpbnZva2VkIGFzIGEgZnVuY3Rpb24gKHdpdGhvdXQgbmV3KVxuICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIGFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncykge1xuICAgIHJldHVybiB0YXJnZXQuZ2V0SW5zdGFuY2UoLi4uYXJncylcbiAgfSxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gbmV3IEkxOE4oKSBpcyBpbnZva2VkXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdCh0YXJnZXQsIGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IHRhcmdldCguLi5hcmdzKVxuICB9LFxuXG4gIC8qKlxuICAgKiBQcm94eSBwcm9wZXJ0eSBhY2Nlc3MgdG8gdGhlIGJhc2UgY2xhc3NcbiAgICovXG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BdXG4gIH0sXG59KVxuXG5leHBvcnQgZGVmYXVsdCBJMThOLmdldEluc3RhbmNlKClcbiJdLCJtYXBwaW5ncyI6IkEsOEdBQXVCRSxPQUFPTSxPQUFPLENBQUVDLE9BQVEsTUFBT0MsS0FBTSxLQ0U1RCxJQUFNQyxFQUFpQixDQUNyQkMsVUFBVyxRQUVYQyxTQUFVLGVBRVZDLE1BQU8sQ0FBQyxT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
Binary file