UNPKG

ontimize-web-ngx

Version:
175 lines 27.1 kB
import { HttpClient } from '@angular/common/http'; import { EventEmitter, Injectable, Injector } from '@angular/core'; import { MatSnackBar } from '@angular/material/snack-bar'; import { TranslateService } from '@ngx-translate/core'; import { Observable } from 'rxjs'; import { AppConfig } from '../../config/app-config'; import * as CORE_TRANSLATIONS from '../../i18n/i18n'; import { MomentService } from '../../services/moment.service'; import { ObservableWrapper } from '../../util/async'; import { Codes } from '../../util/codes'; import { Util } from '../../util/util'; import { O_TRANSLATE_SERVICE } from '../../injection-tokens'; import { _getInjectionTokenValue } from '../../util/injection-token.utils'; import * as i0 from "@angular/core"; export function translateServiceFactory(injector) { const serviceClass = _getInjectionTokenValue(O_TRANSLATE_SERVICE, injector); const service = Util.createServiceInstance(serviceClass, injector); return Util.isDefined(service) ? service : new OTranslateService(injector); } export class OTranslateService { constructor(injector) { this.injector = injector; this.DEFAULT_LANG = 'en'; this.onLanguageChanged = new EventEmitter(); this.notFoundLang = []; this.existingLangFiles = []; this.ngxTranslateService = this.injector.get(TranslateService); this.momentService = this.injector.get(MomentService); this.httpClient = this.injector.get(HttpClient); this.appConfig = this.injector.get(AppConfig); this.localStorageKey = this.appConfig.getConfiguration().uuid; this.defaultLocale = this.appConfig.getConfiguration().defaultLocale; } storeLanguage(language) { if (language) { const dataStr = localStorage.getItem(this.localStorageKey); const data = (dataStr && dataStr.length > 0) ? JSON.parse(dataStr) : {}; data[Codes.LANGUAGE_KEY] = language; try { localStorage.setItem(this.localStorageKey, JSON.stringify(data)); } catch (e) { console.error("Cannot set new item in localStorage. Error: " + e); } } } getStoredLanguage() { const dataStr = localStorage.getItem(this.localStorageKey); return dataStr ? JSON.parse(dataStr)[Codes.LANGUAGE_KEY] : void 0; } checkExistingLangFile(lang) { const self = this; return new Promise((resolve) => { if (self.existingLangFiles.indexOf(lang) !== -1) { resolve(true); return; } const localeAssetsPath = this.ngxTranslateService.currentLoader.prefix; const localeAssetsExtension = this.ngxTranslateService.currentLoader.suffix; self.httpClient.get(localeAssetsPath + lang + localeAssetsExtension).subscribe(() => { if (self.existingLangFiles.indexOf(lang) === -1) { self.existingLangFiles.push(lang); } resolve(true); }, () => { if (self.notFoundLang.indexOf(lang) === -1) { self.notFoundLang.push(lang); } resolve(false); }); }); } setDefaultLang(lang) { this.ngxTranslateService.defaultLang = lang; this.checkExistingLangFile(lang).then((exists) => { if (!exists) { console.error('Default language(' + lang + ') has no bundle file defined'); } }); } get(text, values = []) { let textTranslated; try { const bundle = this.ngxTranslateService.get(text, values); if (bundle) { bundle.subscribe(x => textTranslated = x); } textTranslated = textTranslated === text ? undefined : textTranslated; } catch (e) { textTranslated = undefined; } if (!textTranslated) { const bundle = CORE_TRANSLATIONS.MAP[this.ngxTranslateService.currentLang] || CORE_TRANSLATIONS.MAP[this.defaultLocale] || CORE_TRANSLATIONS.MAP[this.DEFAULT_LANG]; if (bundle && bundle[text]) { textTranslated = bundle[text]; } else { textTranslated = text; } } return textTranslated; } setAppLang(lang) { const observable = new Observable(observer => { this.use(lang, observer); }); return observable; } use(lang, observer) { if (lang === undefined) { const newLang = lang || this.DEFAULT_LANG; this.propagateLang(newLang, {}, observer); } else { this.checkExistingLangFile(lang).then((exists) => { let newLang = lang; if (!exists) { newLang = Util.isDefined(this.appConfig['_config']['defaultLocale']) ? this.appConfig['_config']['defaultLocale'] : this.ngxTranslateService.getDefaultLang(); const translations = CORE_TRANSLATIONS.MAP[newLang] || CORE_TRANSLATIONS.MAP[this.DEFAULT_LANG]; const msg = translations['MESSAGES.ERROR_MISSING_LANG']; this.injector.get(MatSnackBar).open(msg, ' ', { duration: 2500 }); } this.ngxTranslateService.use(newLang).subscribe(res => { this.storeLanguage(newLang); this.propagateLang(newLang, res, observer); }); }); } } propagateLang(lang, langRes, observer) { const coreBundle = CORE_TRANSLATIONS.MAP[lang || this.DEFAULT_LANG]; if (coreBundle !== undefined) { const mixed = Object.assign({}, coreBundle, langRes); this.ngxTranslateService.translations[lang] = mixed; } this.momentService.load(lang); ObservableWrapper.callEmit(this.onLanguageChanged, lang); if (observer) { observer.next(langRes); } } getNgxTranslateService() { return this.ngxTranslateService; } getCurrentLang() { return this.ngxTranslateService.currentLang; } getBrowserLang() { if (typeof window === 'undefined' || typeof window.navigator === 'undefined') { return undefined; } const navigator = window.navigator; let browserLang = navigator.languages ? navigator.languages[0] : null; browserLang = navigator.language || browserLang || navigator.browserLanguage || navigator.userLanguage; if (browserLang.indexOf('-') !== -1) { browserLang = browserLang.split('-')[0]; } if (browserLang.indexOf('_') !== -1) { browserLang = browserLang.split('_')[0]; } return browserLang; } } OTranslateService.ASSETS_PATH = './assets/i18n/'; OTranslateService.ASSETS_EXTENSION = '.json'; OTranslateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTranslateService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); OTranslateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTranslateService, providedIn: 'root', useFactory: translateServiceFactory, deps: [{ token: Injector }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTranslateService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', useFactory: translateServiceFactory, deps: [Injector] }] }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10cmFuc2xhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9zZXJ2aWNlcy90cmFuc2xhdGUvby10cmFuc2xhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssaUJBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7O0FBTTNFLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxRQUFrQjtJQUN4RCxNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFC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SUFBSSxDQUFDO1FBQ3RFLFdBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxJQUFJLFdBQVcsSUFBSSxTQUFTLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUM7UUFDdkcsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ25DLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ25DLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQzs7QUF2S2EsNkJBQVcsR0FBRyxnQkFBZ0IsQ0FBQztBQUMvQixrQ0FBZ0IsR0FBRyxPQUFPLENBQUM7K0dBSDlCLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBREosTUFBTSxjQUFjLHVCQUF1QixrQkFBUyxRQUFROzRGQUN6RSxpQkFBaUI7a0JBRDdCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFwcENvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZy9hcHAtY29uZmlnJztcbmltcG9ydCAqIGFzIENPUkVfVFJBTlNMQVRJT05TIGZyb20gJy4uLy4uL2kxOG4vaTE4bic7XG5pbXBvcnQgeyBNb21lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVdyYXBwZXIgfSBmcm9tICcuLi8uLi91dGlsL2FzeW5jJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHsgT19UUkFOU0xBVEVfU0VSVklDRSB9IGZyb20gJy4uLy4uL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHsgX2dldEluamVjdGlvblRva2VuVmFsdWUgfSBmcm9tICcuLi8uLi91dGlsL2luamVjdGlvbi10b2tlbi51dGlscyc7XG5cbi8qKlxuICogYE9UcmFuc2xhdGVTZXJ2aWNlYCBmYWN0b3J5LlxuICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHJhbnNsYXRlIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVTZXJ2aWNlRmFjdG9yeShpbmplY3RvcjogSW5qZWN0b3IpOiBhbnkge1xuICBjb25zdCBzZXJ2aWNlQ2xhc3MgPSBfZ2V0SW5qZWN0aW9uVG9rZW5WYWx1ZShPX1RSQU5TTEFURV9TRVJWSUNFLCBpbmplY3Rvcik7XG4gIGNvbnN0IHNlcnZpY2UgPSBVdGlsLmNyZWF0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlQ2xhc3MsIGluamVjdG9yKTtcbiAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHNlcnZpY2UpID8gc2VydmljZSA6IG5ldyBPVHJhbnNsYXRlU2VydmljZShpbmplY3Rvcik7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnLCB1c2VGYWN0b3J5OiB0cmFuc2xhdGVTZXJ2aWNlRmFjdG9yeSwgZGVwczogW0luamVjdG9yXSB9KVxuZXhwb3J0IGNsYXNzIE9UcmFuc2xhdGVTZXJ2aWNlIHtcblxuICBwdWJsaWMgc3RhdGljIEFTU0VUU19QQVRIID0gJy4vYXNzZXRzL2kxOG4vJztcbiAgcHVibGljIHN0YXRpYyBBU1NFVFNfRVhURU5TSU9OID0gJy5qc29uJztcbiAgcHVibGljIERFRkFVTFRfTEFORyA9ICdlbic7XG4gIHB1YmxpYyBvbkxhbmd1YWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJvdGVjdGVkIG5neFRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2U7XG4gIHByb3RlY3RlZCBtb21lbnRTZXJ2aWNlOiBNb21lbnRTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudDtcblxuICBwcm90ZWN0ZWQgbG9jYWxTdG9yYWdlS2V5OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBub3RGb3VuZExhbmc6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHJvdGVjdGVkIGFwcENvbmZpZzogQXBwQ29uZmlnO1xuICBwcm90ZWN0ZWQgZXhpc3RpbmdMYW5nRmlsZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHJvdGVjdGVkIGRlZmF1bHRMb2NhbGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5uZ3hUcmFuc2xhdGVTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgdGhpcy5tb21lbnRTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoTW9tZW50U2VydmljZSk7XG4gICAgdGhpcy5odHRwQ2xpZW50ID0gdGhpcy5pbmplY3Rvci5nZXQoSHR0cENsaWVudCk7XG4gICAgdGhpcy5hcHBDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChBcHBDb25maWcpO1xuICAgIHRoaXMubG9jYWxTdG9yYWdlS2V5ID0gdGhpcy5hcHBDb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLnV1aWQ7XG4gICAgdGhpcy5kZWZhdWx0TG9jYWxlID0gdGhpcy5hcHBDb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmRlZmF1bHRMb2NhbGU7XG4gIH1cblxuICBwdWJsaWMgc3RvcmVMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBkYXRhU3RyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkpO1xuICAgICAgY29uc3QgZGF0YSA9IChkYXRhU3RyICYmIGRhdGFTdHIubGVuZ3RoID4gMCkgPyBKU09OLnBhcnNlKGRhdGFTdHIpIDoge307XG4gICAgICBkYXRhW0NvZGVzLkxBTkdVQUdFX0tFWV0gPSBsYW5ndWFnZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3Qgc2V0IG5ldyBpdGVtIGluIGxvY2FsU3RvcmFnZS4gRXJyb3I6IFwiICsgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFN0b3JlZExhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YVN0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KTtcbiAgICByZXR1cm4gZGF0YVN0ciA/IEpTT04ucGFyc2UoZGF0YVN0cilbQ29kZXMuTEFOR1VBR0VfS0VZXSA6IHZvaWQgMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0V4aXN0aW5nTGFuZ0ZpbGUobGFuZzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmIChzZWxmLmV4aXN0aW5nTGFuZ0ZpbGVzLmluZGV4T2YobGFuZykgIT09IC0xKSB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvY2FsZUFzc2V0c1BhdGggPSAodGhpcy5uZ3hUcmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMb2FkZXIgYXMgYW55KS5wcmVmaXg7XG4gICAgICBjb25zdCBsb2NhbGVBc3NldHNFeHRlbnNpb24gPSAodGhpcy5uZ3hUcmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMb2FkZXIgYXMgYW55KS5zdWZmaXg7XG4gICAgICBzZWxmLmh0dHBDbGllbnQuZ2V0KGxvY2FsZUFzc2V0c1BhdGggKyBsYW5nICsgbG9jYWxlQXNzZXRzRXh0ZW5zaW9uKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoc2VsZi5leGlzdGluZ0xhbmdGaWxlcy5pbmRleE9mKGxhbmcpID09PSAtMSkge1xuICAgICAgICAgIHNlbGYuZXhpc3RpbmdMYW5nRmlsZXMucHVzaChsYW5nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJMThOIEZpbGUgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAvLyBJMThOIEZpbGUgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgaWYgKHNlbGYubm90Rm91bmRMYW5nLmluZGV4T2YobGFuZykgPT09IC0xKSB7XG4gICAgICAgICAgc2VsZi5ub3RGb3VuZExhbmcucHVzaChsYW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldERlZmF1bHRMYW5nKGxhbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS5kZWZhdWx0TGFuZyA9IGxhbmc7XG4gICAgdGhpcy5jaGVja0V4aXN0aW5nTGFuZ0ZpbGUobGFuZykudGhlbigoZXhpc3RzKSA9PiB7XG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdEZWZhdWx0IGxhbmd1YWdlKCcgKyBsYW5nICsgJykgaGFzIG5vIGJ1bmRsZSBmaWxlIGRlZmluZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQodGV4dDogc3RyaW5nLCB2YWx1ZXM6IGFueVtdID0gW10pOiBzdHJpbmcge1xuICAgIGxldCB0ZXh0VHJhbnNsYXRlZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYnVuZGxlID0gdGhpcy5uZ3hUcmFuc2xhdGVTZXJ2aWNlLmdldCh0ZXh0LCB2YWx1ZXMpO1xuICAgICAgaWYgKGJ1bmRsZSkge1xuICAgICAgICBidW5kbGUuc3Vic2NyaWJlKHggPT4gdGV4dFRyYW5zbGF0ZWQgPSB4KTtcbiAgICAgIH1cbiAgICAgIHRleHRUcmFuc2xhdGVkID0gdGV4dFRyYW5zbGF0ZWQgPT09IHRleHQgPyB1bmRlZmluZWQgOiB0ZXh0VHJhbnNsYXRlZDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0ZXh0VHJhbnNsYXRlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0ZXh0VHJhbnNsYXRlZCkge1xuICAgICAgY29uc3QgYnVuZGxlID0gQ09SRV9UUkFOU0xBVElPTlMuTUFQW3RoaXMubmd4VHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZ10gfHwgQ09SRV9UUkFOU0xBVElPTlMuTUFQW3RoaXMuZGVmYXVsdExvY2FsZV0gfHwgQ09SRV9UUkFOU0xBVElPTlMuTUFQW3RoaXMuREVGQVVMVF9MQU5HXTtcbiAgICAgIGlmIChidW5kbGUgJiYgYnVuZGxlW3RleHRdKSB7XG4gICAgICAgIHRleHRUcmFuc2xhdGVkID0gYnVuZGxlW3RleHRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dFRyYW5zbGF0ZWQgPSB0ZXh0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dFRyYW5zbGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QXBwTGFuZyhsYW5nOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICB0aGlzLnVzZShsYW5nLCBvYnNlcnZlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG4gIH1cblxuICBwdWJsaWMgdXNlKGxhbmc6IHN0cmluZywgb2JzZXJ2ZXI/OiBTdWJzY3JpYmVyPGFueT4pOiB2b2lkIHtcbiAgICBpZiAobGFuZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuZXdMYW5nID0gbGFuZyB8fCB0aGlzLkRFRkFVTFRfTEFORztcbiAgICAgIC8vIHNldHRpbmcgbGFuZyBmb3IgaW5pdGlhbGl6SU5HIG1vbWVudCBhbmQgb3RoZXIgY29tcG9uZW50c1xuICAgICAgdGhpcy5wcm9wYWdhdGVMYW5nKG5ld0xhbmcsIHt9LCBvYnNlcnZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hlY2tFeGlzdGluZ0xhbmdGaWxlKGxhbmcpLnRoZW4oKGV4aXN0cykgPT4ge1xuICAgICAgICBsZXQgbmV3TGFuZyA9IGxhbmc7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgbmV3TGFuZyA9IFV0aWwuaXNEZWZpbmVkKHRoaXMuYXBwQ29uZmlnWydfY29uZmlnJ11bJ2RlZmF1bHRMb2NhbGUnXSkgPyB0aGlzLmFwcENvbmZpZ1snX2NvbmZpZyddWydkZWZhdWx0TG9jYWxlJ10gOiB0aGlzLm5neFRyYW5zbGF0ZVNlcnZpY2UuZ2V0RGVmYXVsdExhbmcoKTtcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBDT1JFX1RSQU5TTEFUSU9OUy5NQVBbbmV3TGFuZ10gfHwgQ09SRV9UUkFOU0xBVElPTlMuTUFQW3RoaXMuREVGQVVMVF9MQU5HXTtcbiAgICAgICAgICBjb25zdCBtc2cgPSB0cmFuc2xhdGlvbnNbJ01FU1NBR0VTLkVSUk9SX01JU1NJTkdfTEFORyddO1xuICAgICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KE1hdFNuYWNrQmFyKS5vcGVuKG1zZywgJyAnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMjUwMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS51c2UobmV3TGFuZykuc3Vic2NyaWJlKFxuICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlTGFuZ3VhZ2UobmV3TGFuZyk7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZUxhbmcobmV3TGFuZywgcmVzLCBvYnNlcnZlcik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHByb3BhZ2F0ZUxhbmcobGFuZzogc3RyaW5nLCBsYW5nUmVzPzogYW55LCBvYnNlcnZlcj86IFN1YnNjcmliZXI8YW55Pikge1xuICAgIGNvbnN0IGNvcmVCdW5kbGUgPSBDT1JFX1RSQU5TTEFUSU9OUy5NQVBbbGFuZyB8fCB0aGlzLkRFRkFVTFRfTEFOR107XG4gICAgaWYgKGNvcmVCdW5kbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWl4ZWQgPSBPYmplY3QuYXNzaWduKHt9LCBjb3JlQnVuZGxlLCBsYW5nUmVzKTtcbiAgICAgIHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGlvbnNbbGFuZ10gPSBtaXhlZDtcbiAgICB9XG4gICAgdGhpcy5tb21lbnRTZXJ2aWNlLmxvYWQobGFuZyk7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkxhbmd1YWdlQ2hhbmdlZCwgbGFuZyk7XG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5uZXh0KGxhbmdSZXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXROZ3hUcmFuc2xhdGVTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLm5neFRyYW5zbGF0ZVNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudExhbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZztcbiAgfVxuXG4gIHB1YmxpYyBnZXRCcm93c2VyTGFuZygpIHtcbiAgICAvLyBjb3B5aW5nIHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS5nZXRCcm93c2VyTGFuZygpIGJ1dCB3aXRoIGEgZml4IGZvciBkZWZhdWx0IHNlbGVjdGVkIGxhbmd1YWdlIChicm93c2VyTGFuZylcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBuYXZpZ2F0b3I6IGFueSA9IHdpbmRvdy5uYXZpZ2F0b3I7XG4gICAgbGV0IGJyb3dzZXJMYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlcyA/IG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiBudWxsO1xuICAgIGJyb3dzZXJMYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlIHx8IGJyb3dzZXJMYW5nIHx8IG5hdmlnYXRvci5icm93c2VyTGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZTtcbiAgICBpZiAoYnJvd3NlckxhbmcuaW5kZXhPZignLScpICE9PSAtMSkge1xuICAgICAgYnJvd3NlckxhbmcgPSBicm93c2VyTGFuZy5zcGxpdCgnLScpWzBdO1xuICAgIH1cbiAgICBpZiAoYnJvd3NlckxhbmcuaW5kZXhPZignXycpICE9PSAtMSkge1xuICAgICAgYnJvd3NlckxhbmcgPSBicm93c2VyTGFuZy5zcGxpdCgnXycpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gYnJvd3Nlckxhbmc7XG4gIH1cblxufVxuIl19