UNPKG

@lifeintelligencegroup/ngx-lig-ari

Version:

Life Intelligence Group Artificial Intelligence

243 lines 30.2 kB
import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import isEmpty from 'lodash-es/isEmpty'; import { v4 as uuidv4 } from 'uuid'; import { AriMobileComponent } from '../ari-mobile/ari-mobile.component'; import { ariRhymes } from '../model/ari-bot.mode'; import * as i0 from "@angular/core"; import * as i1 from "@ionic/angular"; import * as i2 from "./localstorage.service"; import * as i3 from "@ionic-native/speech-recognition/ngx"; import * as i4 from "./common.service"; import * as i5 from "./ari-speech.service"; export var AriStatus; (function (AriStatus) { AriStatus[AriStatus["Open"] = 0] = "Open"; AriStatus[AriStatus["Close"] = 1] = "Close"; })(AriStatus || (AriStatus = {})); export class NgxLigAriService { constructor(modalController, plt, localStorageService, speechRecognition, commonService, // private ariBotService: AriBotService, ariSpeechService) { this.modalController = modalController; this.plt = plt; this.localStorageService = localStorageService; this.speechRecognition = speechRecognition; this.commonService = commonService; this.ariSpeechService = ariSpeechService; this.showAriChatBox = false; this.status = new BehaviorSubject(AriStatus.Close); this.ariPopUp = false; this.activatedByVoice = false; this.voiceActivatorOff = true; this.status.next(AriStatus.Close); this.initAriStatus(); setTimeout(() => { this.commonService.setNewUser(); }, 1000); } async openMobileAri() { const modal = await this.modalController.create({ component: AriMobileComponent, cssClass: 'ari-tablet-modal-css', backdropDismiss: false, showBackdrop: false, keyboardClose: false, }); modal.present(); } initAriStatus() { this.status.next(AriStatus.Close); } setUserID(user) { this.userUUID = user; } getUser() { if (isEmpty(this.userUUID)) { return uuidv4(); } else { return this.userUUID; } } async ariVoiceActivator() { // Initiate on main component to call ari by simply saying "Hey ari" or "Ok ari" this.ariSpeechService.initWebSpeechRecognition(); this.plt.ready().then(() => { if (this.plt.is('cordova') || this.plt.is('capacitor')) { this.speechRecognition .hasPermission() .then((hasPermission) => { if (!hasPermission) { this.speechRecognition.requestPermission().then(() => { this.startMobileVoiceActivation(); }); } else { this.startMobileVoiceActivation(); } }); } else { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; if (SpeechRecognition && !this.voiceActivatorOff) { this.SpeechRecognition = new SpeechRecognition(); this.SpeechRecognition.start(); this.SpeechRecognition.addEventListener('result', (e) => { const transcript = Array.from(e.results) .map((result) => result[0]) .map((result) => result.transcript) .join(''); if (ariRhymes.indexOf(transcript.toLowerCase()) >= 0) { console.log(transcript); this.ariPopUp = true; if (this.activatedByVoice) { this.showAriByVoice(); } else { this.showAri(); } this.SpeechRecognition.stop(); } }); this.SpeechRecognition.addEventListener('end', (e) => { if (!this.ariPopUp && !this.voiceActivatorOff) { this.stopCurrentSpeech(); this.ariVoiceActivator(); } }); } } }); } startMobileVoiceActivation() { this.speechRecognition .startListening({ language: 'en-US', showPartial: false, showPopup: false, }) .subscribe((matches) => { const foundmatches = matches.filter((item) => { if (ariRhymes.indexOf(item.toLowerCase()) >= 0) { return item; } }); if (foundmatches.length > 0) { this.ariPopUp = true; if (this.activatedByVoice) { this.showAriByVoice(); } else { this.showAri(); } this.speechRecognition.stopListening(); } }, (onerror) => { console.error('Speech Recognition error: ', onerror); if (onerror === 'No match') { if (!this.ariPopUp) { this.ariVoiceActivator(); } } }); } ariVoiceActivatorOn() { this.activatedByVoice = true; this.voiceActivatorOff = false; this.ariVoiceActivator(); } ariVoiceActivatorOff() { this.voiceActivatorOff = true; this.stopCurrentSpeech(); } showAriByVoice() { if (this.plt.is('mobile') && !this.plt.is('tablet')) { setTimeout(() => { this.status.next(AriStatus.Open); this.openMobileAri(); }, 1000); } else if (this.plt.is('desktop') || this.plt.is('tablet')) { setTimeout(() => { this.status.next(AriStatus.Open); }, 1000); } } showAri() { console.log("isDesktop? ", this.plt.is("desktop")); console.log("Platform? ", this.plt.platforms()); this.activatedByVoice = false; // this.ariBotService.initConversation(); if (this.plt.is('mobile') && !this.plt.is('tablet')) { this.speechRecognition.stopListening(); setTimeout(() => { this.status.next(AriStatus.Open); this.openMobileAri(); }, 1000); } else if ((this.plt.is('desktop') || this.plt.is('tablet'))) { this.stopCurrentSpeech(); setTimeout(() => { this.status.next(AriStatus.Open); }, 1000); } } closeAri() { this.stopCurrentSpeech(); if (this.plt.is('mobile') && !this.plt.is('tablet')) { if (this.speechRecognition) { this.speechRecognition.stopListening(); } this.status.next(AriStatus.Close); this.modalController.dismiss(); } else if (this.plt.is('desktop') || this.plt.is('tablet')) { if (this.SpeechRecognition) { this.SpeechRecognition.stop(); } this.status.next(AriStatus.Close); } this.ariPopUp = false; this.localStorageService.removeItem('AriCreds'); setTimeout(() => { if (!this.voiceActivatorOff) { this.ariVoiceActivator(); // Onclose recall voice activator for Desktop } this.activatedByVoice = false; }, 1000); } stopCurrentSpeech() { // STOP VOICE ACTIVATION TO PREVENT RUNNING 2 SPEECH RECOGNITION THAT CAUSE "ABORTED" ERROR if (this.plt.is('cordova') || this.plt.is('capacitor')) { this.speechRecognition.stopListening(); } else { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; if (SpeechRecognition) { this.SpeechRecognition = new SpeechRecognition(); this.SpeechRecognition.stop(); } } } toggleAri() { this.showAriChatBox = !this.showAriChatBox; const status = this.showAriChatBox ? AriStatus.Open : AriStatus.Close; this.status.next(status); } onAriStatusChange() { return this.status.asObservable(); } getCurrentAriStatus() { return this.status.getValue(); } } NgxLigAriService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: NgxLigAriService, deps: [{ token: i1.ModalController }, { token: i1.Platform }, { token: i2.LocalstorageService }, { token: i3.SpeechRecognition }, { token: i4.CommonService }, { token: i5.AriSpeechService }], target: i0.ɵɵFactoryTarget.Injectable }); NgxLigAriService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: NgxLigAriService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: NgxLigAriService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i1.ModalController }, { type: i1.Platform }, { type: i2.LocalstorageService }, { type: i3.SpeechRecognition }, { type: i4.CommonService }, { type: i5.AriSpeechService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWxpZy1hcmkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWctYXJpL3NyYy9saWIvc2VydmljZXMvbmd4LWxpZy1hcmkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7O0FBS2xELE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIseUNBQUksQ0FBQTtJQUNKLDJDQUFLLENBQUE7QUFDUCxDQUFDLEVBSFcsU0FBUyxLQUFULFNBQVMsUUFHcEI7QUFLRCxNQUFNLE9BQU8sZ0JBQWdCO0lBVTNCLFlBQ1UsZUFBZ0MsRUFDaEMsR0FBYSxFQUNiLG1CQUF3QyxFQUN4QyxpQkFBcUMsRUFDckMsYUFBNEI7SUFDcEMsd0NBQXdDO0lBQ2hDLGdCQUFrQztRQU5sQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsUUFBRyxHQUFILEdBQUcsQ0FBVTtRQUNiLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFvQjtRQUNyQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUU1QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBaEJwQyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixXQUFNLEdBQStCLElBQUksZUFBZSxDQUM5RCxTQUFTLENB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QyxDQUFDO0lBQzNCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7NkdBbE9VLGdCQUFnQjtpSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBQbGF0Zm9ybSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoLWVzL2lzRW1wdHknO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBBcmlNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuLi9hcmktbW9iaWxlL2FyaS1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IExvY2Fsc3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2xvY2Fsc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFyaVNwZWVjaFNlcnZpY2UgfSBmcm9tICcuL2FyaS1zcGVlY2guc2VydmljZSc7XG5pbXBvcnQgeyBTcGVlY2hSZWNvZ25pdGlvbiBhcyBUU3BlZWNoUmVjb2duaXRpb24gfSBmcm9tICdAaW9uaWMtbmF0aXZlL3NwZWVjaC1yZWNvZ25pdGlvbi9uZ3gnO1xuaW1wb3J0IHsgYXJpUmh5bWVzIH0gZnJvbSAnLi4vbW9kZWwvYXJpLWJvdC5tb2RlJztcbi8vIGltcG9ydCB7IEFyaUJvdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hcmktYm90LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4vY29tbW9uLnNlcnZpY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xuZXhwb3J0IGVudW0gQXJpU3RhdHVzIHtcbiAgT3BlbixcbiAgQ2xvc2UsXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hMaWdBcmlTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzaG93QXJpQ2hhdEJveCA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXR1czogQmVoYXZpb3JTdWJqZWN0PEFyaVN0YXR1cz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxuICAgIEFyaVN0YXR1cy5DbG9zZVxuICApO1xuICBhcmlQb3BVcCA9IGZhbHNlO1xuICBhY3RpdmF0ZWRCeVZvaWNlID0gZmFsc2U7XG4gIHZvaWNlQWN0aXZhdG9yT2ZmID0gdHJ1ZTtcbiAgcHJpdmF0ZSB1c2VyVVVJRDogc3RyaW5nO1xuICBTcGVlY2hSZWNvZ25pdGlvbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIHBsdDogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbHN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3BlZWNoUmVjb2duaXRpb246IFRTcGVlY2hSZWNvZ25pdGlvbixcbiAgICBwcml2YXRlIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgLy8gcHJpdmF0ZSBhcmlCb3RTZXJ2aWNlOiBBcmlCb3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXJpU3BlZWNoU2VydmljZTogQXJpU3BlZWNoU2VydmljZVxuICApIHtcbiAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5DbG9zZSk7XG4gICAgdGhpcy5pbml0QXJpU3RhdHVzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbW1vblNlcnZpY2Uuc2V0TmV3VXNlcigpO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9iaWxlQXJpKCkge1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogQXJpTW9iaWxlQ29tcG9uZW50LFxuICAgICAgY3NzQ2xhc3M6ICdhcmktdGFibGV0LW1vZGFsLWNzcycsXG4gICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlLFxuICAgICAgc2hvd0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgIGtleWJvYXJkQ2xvc2U6IGZhbHNlLFxuICAgIH0pO1xuICAgIG1vZGFsLnByZXNlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEFyaVN0YXR1cygpIHtcbiAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5DbG9zZSk7XG4gIH1cblxuICBzZXRVc2VySUQodXNlcjogc3RyaW5nKSB7XG4gICAgdGhpcy51c2VyVVVJRCA9IHVzZXI7XG4gIH1cblxuICBnZXRVc2VyKCkge1xuICAgIGlmIChpc0VtcHR5KHRoaXMudXNlclVVSUQpKSB7XG4gICAgICByZXR1cm4gdXVpZHY0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVzZXJVVUlEO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFyaVZvaWNlQWN0aXZhdG9yKCkge1xuICAgIC8vIEluaXRpYXRlIG9uIG1haW4gY29tcG9uZW50IHRvIGNhbGwgYXJpIGJ5IHNpbXBseSBzYXlpbmcgXCJIZXkgYXJpXCIgb3IgXCJPayBhcmlcIlxuICAgIHRoaXMuYXJpU3BlZWNoU2VydmljZS5pbml0V2ViU3BlZWNoUmVjb2duaXRpb24oKTtcbiAgICB0aGlzLnBsdC5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGx0LmlzKCdjb3Jkb3ZhJykgfHwgdGhpcy5wbHQuaXMoJ2NhcGFjaXRvcicpKSB7XG4gICAgICAgIHRoaXMuc3BlZWNoUmVjb2duaXRpb25cbiAgICAgICAgICAuaGFzUGVybWlzc2lvbigpXG4gICAgICAgICAgLnRoZW4oKGhhc1Blcm1pc3Npb246IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzUGVybWlzc2lvbikge1xuICAgICAgICAgICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydE1vYmlsZVZvaWNlQWN0aXZhdGlvbigpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRNb2JpbGVWb2ljZUFjdGl2YXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uID1cbiAgICAgICAgICB3aW5kb3cuU3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uO1xuICAgICAgICBpZiAoU3BlZWNoUmVjb2duaXRpb24gJiYgIXRoaXMudm9pY2VBY3RpdmF0b3JPZmYpIHtcbiAgICAgICAgICB0aGlzLlNwZWVjaFJlY29nbml0aW9uID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKCk7XG4gICAgICAgICAgdGhpcy5TcGVlY2hSZWNvZ25pdGlvbi5zdGFydCgpO1xuICAgICAgICAgIHRoaXMuU3BlZWNoUmVjb2duaXRpb24uYWRkRXZlbnRMaXN0ZW5lcigncmVzdWx0JywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zY3JpcHQgPSBBcnJheS5mcm9tKGUucmVzdWx0cylcbiAgICAgICAgICAgICAgLm1hcCgocmVzdWx0KSA9PiByZXN1bHRbMF0pXG4gICAgICAgICAgICAgIC5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LnRyYW5zY3JpcHQpXG4gICAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgICAgIGlmIChhcmlSaHltZXMuaW5kZXhPZih0cmFuc2NyaXB0LnRvTG93ZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2codHJhbnNjcmlwdClcbiAgICAgICAgICAgICAgdGhpcy5hcmlQb3BVcCA9IHRydWU7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2YXRlZEJ5Vm9pY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dBcmlCeVZvaWNlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QXJpKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5TcGVlY2hSZWNvZ25pdGlvbi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5TcGVlY2hSZWNvZ25pdGlvbi5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFyaVBvcFVwICYmICF0aGlzLnZvaWNlQWN0aXZhdG9yT2ZmKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcEN1cnJlbnRTcGVlY2goKTtcbiAgICAgICAgICAgICAgdGhpcy5hcmlWb2ljZUFjdGl2YXRvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgc3RhcnRNb2JpbGVWb2ljZUFjdGl2YXRpb24oKSB7XG4gICAgdGhpcy5zcGVlY2hSZWNvZ25pdGlvblxuICAgICAgLnN0YXJ0TGlzdGVuaW5nKHtcbiAgICAgICAgbGFuZ3VhZ2U6ICdlbi1VUycsXG4gICAgICAgIHNob3dQYXJ0aWFsOiBmYWxzZSxcbiAgICAgICAgc2hvd1BvcHVwOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAobWF0Y2hlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRtYXRjaGVzID0gbWF0Y2hlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChhcmlSaHltZXMuaW5kZXhPZihpdGVtLnRvTG93ZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZvdW5kbWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFyaVBvcFVwID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2YXRlZEJ5Vm9pY2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93QXJpQnlWb2ljZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93QXJpKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChvbmVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignU3BlZWNoIFJlY29nbml0aW9uIGVycm9yOiAnLCBvbmVycm9yKTtcbiAgICAgICAgICBpZiAob25lcnJvciA9PT0gJ05vIG1hdGNoJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFyaVBvcFVwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXJpVm9pY2VBY3RpdmF0b3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cbiAgYXJpVm9pY2VBY3RpdmF0b3JPbigpIHtcbiAgICB0aGlzLmFjdGl2YXRlZEJ5Vm9pY2UgPSB0cnVlO1xuICAgIHRoaXMudm9pY2VBY3RpdmF0b3JPZmYgPSBmYWxzZTtcbiAgICB0aGlzLmFyaVZvaWNlQWN0aXZhdG9yKCk7XG4gIH1cblxuICBhcmlWb2ljZUFjdGl2YXRvck9mZigpIHtcbiAgICB0aGlzLnZvaWNlQWN0aXZhdG9yT2ZmID0gdHJ1ZTtcbiAgICB0aGlzLnN0b3BDdXJyZW50U3BlZWNoKCk7XG4gIH1cblxuICBzaG93QXJpQnlWb2ljZSgpIHtcbiAgICBpZiAodGhpcy5wbHQuaXMoJ21vYmlsZScpICYmICF0aGlzLnBsdC5pcygndGFibGV0JykpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5PcGVuKTtcbiAgICAgICAgdGhpcy5vcGVuTW9iaWxlQXJpKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGx0LmlzKCdkZXNrdG9wJykgfHwgdGhpcy5wbHQuaXMoJ3RhYmxldCcpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0dXMubmV4dChBcmlTdGF0dXMuT3Blbik7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBzaG93QXJpKCkge1xuICAgIGNvbnNvbGUubG9nKFwiaXNEZXNrdG9wPyBcIiwgdGhpcy5wbHQuaXMoXCJkZXNrdG9wXCIpKTtcbiAgICBjb25zb2xlLmxvZyhcIlBsYXRmb3JtPyBcIiwgdGhpcy5wbHQucGxhdGZvcm1zKCkpO1xuICAgIHRoaXMuYWN0aXZhdGVkQnlWb2ljZSA9IGZhbHNlO1xuICAgIC8vIHRoaXMuYXJpQm90U2VydmljZS5pbml0Q29udmVyc2F0aW9uKCk7XG4gICAgaWYgKHRoaXMucGx0LmlzKCdtb2JpbGUnKSAmJiAhdGhpcy5wbHQuaXMoJ3RhYmxldCcpKSB7XG4gICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5PcGVuKTtcbiAgICAgICAgdGhpcy5vcGVuTW9iaWxlQXJpKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9IGVsc2UgaWYgKCh0aGlzLnBsdC5pcygnZGVza3RvcCcpIHx8IHRoaXMucGx0LmlzKCd0YWJsZXQnKSkpIHtcbiAgICAgIHRoaXMuc3RvcEN1cnJlbnRTcGVlY2goKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5PcGVuKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlQXJpKCkge1xuICAgIHRoaXMuc3RvcEN1cnJlbnRTcGVlY2goKTtcbiAgICBpZiAodGhpcy5wbHQuaXMoJ21vYmlsZScpICYmICF0aGlzLnBsdC5pcygndGFibGV0JykpIHtcbiAgICAgIGlmICh0aGlzLnNwZWVjaFJlY29nbml0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlZWNoUmVjb2duaXRpb24uc3RvcExpc3RlbmluZygpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMubmV4dChBcmlTdGF0dXMuQ2xvc2UpO1xuICAgICAgdGhpcy5tb2RhbENvbnRyb2xsZXIuZGlzbWlzcygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wbHQuaXMoJ2Rlc2t0b3AnKSB8fCB0aGlzLnBsdC5pcygndGFibGV0JykpIHtcbiAgICAgIGlmICh0aGlzLlNwZWVjaFJlY29nbml0aW9uKSB7XG4gICAgICAgIHRoaXMuU3BlZWNoUmVjb2duaXRpb24uc3RvcCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMubmV4dChBcmlTdGF0dXMuQ2xvc2UpO1xuICAgIH1cbiAgICB0aGlzLmFyaVBvcFVwID0gZmFsc2U7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oJ0FyaUNyZWRzJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMudm9pY2VBY3RpdmF0b3JPZmYpIHtcbiAgICAgICAgdGhpcy5hcmlWb2ljZUFjdGl2YXRvcigpOyAvLyBPbmNsb3NlIHJlY2FsbCB2b2ljZSBhY3RpdmF0b3IgZm9yIERlc2t0b3BcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZhdGVkQnlWb2ljZSA9IGZhbHNlO1xuICAgIH0sIDEwMDApO1xuICB9XG4gIHN0b3BDdXJyZW50U3BlZWNoKCkge1xuICAgIC8vIFNUT1AgVk9JQ0UgQUNUSVZBVElPTiBUTyBQUkVWRU5UIFJVTk5JTkcgMiBTUEVFQ0ggUkVDT0dOSVRJT04gVEhBVCBDQVVTRSBcIkFCT1JURURcIiBFUlJPUlxuICAgIGlmICh0aGlzLnBsdC5pcygnY29yZG92YScpIHx8IHRoaXMucGx0LmlzKCdjYXBhY2l0b3InKSkge1xuICAgICAgdGhpcy5zcGVlY2hSZWNvZ25pdGlvbi5zdG9wTGlzdGVuaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uID1cbiAgICAgICAgd2luZG93LlNwZWVjaFJlY29nbml0aW9uIHx8IHdpbmRvdy53ZWJraXRTcGVlY2hSZWNvZ25pdGlvbjtcbiAgICAgIGlmIChTcGVlY2hSZWNvZ25pdGlvbikge1xuICAgICAgICB0aGlzLlNwZWVjaFJlY29nbml0aW9uID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKCk7XG4gICAgICAgIHRoaXMuU3BlZWNoUmVjb2duaXRpb24uc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB0b2dnbGVBcmkoKSB7XG4gICAgdGhpcy5zaG93QXJpQ2hhdEJveCA9ICF0aGlzLnNob3dBcmlDaGF0Qm94O1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuc2hvd0FyaUNoYXRCb3ggPyBBcmlTdGF0dXMuT3BlbiA6IEFyaVN0YXR1cy5DbG9zZTtcbiAgICB0aGlzLnN0YXR1cy5uZXh0KHN0YXR1cyk7XG4gIH1cblxuICBvbkFyaVN0YXR1c0NoYW5nZSgpOiBPYnNlcnZhYmxlPEFyaVN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRBcmlTdGF0dXMoKTogQXJpU3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMuZ2V0VmFsdWUoKTtcbiAgfVxufVxuIl19