| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- import { isPlatformBrowser } from "@angular/common";
- import { Inject, Injectable, Optional, PLATFORM_ID } from "@angular/core";
- import { Subject } from "rxjs";
- import { loader } from "./load-script";
- import { RECAPTCHA_BASE_URL, RECAPTCHA_LANGUAGE, RECAPTCHA_NONCE, RECAPTCHA_V3_SITE_KEY } from "./tokens";
- import * as i0 from "@angular/core";
- /**
- * The main service for working with reCAPTCHA v3 APIs.
- *
- * Use the `execute` method for executing a single action, and
- * `onExecute` observable for listening to all actions at once.
- */
- export class ReCaptchaV3Service {
- constructor(zone, siteKey,
- // eslint-disable-next-line @typescript-eslint/ban-types
- platformId, baseUrl, nonce, language) {
- /** @internal */
- this.onLoadComplete = (grecaptcha) => {
- this.grecaptcha = grecaptcha;
- if (this.actionBacklog && this.actionBacklog.length > 0) {
- this.actionBacklog.forEach(([action, subject]) => this.executeActionWithSubject(action, subject));
- this.actionBacklog = undefined;
- }
- };
- this.zone = zone;
- this.isBrowser = isPlatformBrowser(platformId);
- this.siteKey = siteKey;
- this.nonce = nonce;
- this.language = language;
- this.baseUrl = baseUrl;
- this.init();
- }
- get onExecute() {
- if (!this.onExecuteSubject) {
- this.onExecuteSubject = new Subject();
- this.onExecuteObservable = this.onExecuteSubject.asObservable();
- }
- return this.onExecuteObservable;
- }
- get onExecuteError() {
- if (!this.onExecuteErrorSubject) {
- this.onExecuteErrorSubject = new Subject();
- this.onExecuteErrorObservable = this.onExecuteErrorSubject.asObservable();
- }
- return this.onExecuteErrorObservable;
- }
- /**
- * Executes the provided `action` with reCAPTCHA v3 API.
- * Use the emitted token value for verification purposes on the backend.
- *
- * For more information about reCAPTCHA v3 actions and tokens refer to the official documentation at
- * https://developers.google.com/recaptcha/docs/v3.
- *
- * @param {string} action the action to execute
- * @returns {Observable<string>} an `Observable` that will emit the reCAPTCHA v3 string `token` value whenever ready.
- * The returned `Observable` completes immediately after emitting a value.
- */
- execute(action) {
- const subject = new Subject();
- if (this.isBrowser) {
- if (!this.grecaptcha) {
- if (!this.actionBacklog) {
- this.actionBacklog = [];
- }
- this.actionBacklog.push([action, subject]);
- }
- else {
- this.executeActionWithSubject(action, subject);
- }
- }
- return subject.asObservable();
- }
- /** @internal */
- executeActionWithSubject(action, subject) {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- const onError = (error) => {
- this.zone.run(() => {
- subject.error(error);
- if (this.onExecuteErrorSubject) {
- // We don't know any better at this point, unfortunately, so have to resort to `any`
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
- this.onExecuteErrorSubject.next({ action, error });
- }
- });
- };
- this.zone.runOutsideAngular(() => {
- try {
- this.grecaptcha.execute(this.siteKey, { action }).then((token) => {
- this.zone.run(() => {
- subject.next(token);
- subject.complete();
- if (this.onExecuteSubject) {
- this.onExecuteSubject.next({ action, token });
- }
- });
- }, onError);
- }
- catch (e) {
- onError(e);
- }
- });
- }
- /** @internal */
- init() {
- if (this.isBrowser) {
- if ("grecaptcha" in window) {
- this.grecaptcha = grecaptcha;
- }
- else {
- const langParam = this.language ? "&hl=" + this.language : "";
- loader.loadScript(this.siteKey, this.onLoadComplete, langParam, this.baseUrl, this.nonce);
- }
- }
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: ReCaptchaV3Service, deps: [{ token: i0.NgZone }, { token: RECAPTCHA_V3_SITE_KEY }, { token: PLATFORM_ID }, { token: RECAPTCHA_BASE_URL, optional: true }, { token: RECAPTCHA_NONCE, optional: true }, { token: RECAPTCHA_LANGUAGE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: ReCaptchaV3Service }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: ReCaptchaV3Service, decorators: [{
- type: Injectable
- }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: undefined, decorators: [{
- type: Inject,
- args: [RECAPTCHA_V3_SITE_KEY]
- }] }, { type: Object, decorators: [{
- type: Inject,
- args: [PLATFORM_ID]
- }] }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [RECAPTCHA_BASE_URL]
- }] }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [RECAPTCHA_NONCE]
- }] }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [RECAPTCHA_LANGUAGE]
- }] }]; } });
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLXYzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1yZWNhcHRjaGEvc3JjL2xpYi9yZWNhcHRjaGEtdjMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBVSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDOztBQTJCMUc7Ozs7O0dBS0c7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBMkI3QixZQUNFLElBQVksRUFDbUIsT0FBZTtJQUM5Qyx3REFBd0Q7SUFDbkMsVUFBa0IsRUFDQyxPQUFnQixFQUNuQixLQUFjLEVBQ1gsUUFBaUI7UUFxRzNELGdCQUFnQjtRQUNSLG1CQUFjLEdBQUcsQ0FBQyxVQUFpQyxFQUFFLEVBQUU7WUFDN0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNsRyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQzthQUNoQztR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QUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUsIE9wdGlvbmFsLCBQTEFURk9STV9JRCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgbG9hZGVyIH0gZnJvbSBcIi4vbG9hZC1zY3JpcHRcIjtcbmltcG9ydCB7IFJFQ0FQVENIQV9CQVNFX1VSTCwgUkVDQVBUQ0hBX0xBTkdVQUdFLCBSRUNBUFRDSEFfTk9OQ0UsIFJFQ0FQVENIQV9WM19TSVRFX0tFWSB9IGZyb20gXCIuL3Rva2Vuc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9uRXhlY3V0ZURhdGEge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGhhcyBiZWVuIGV4ZWN1dGVkLlxuICAgKi9cbiAgYWN0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdGhhdCByZUNBUFRDSEEgdjMgcHJvdmlkZWQgd2hlbiBleGVjdXRpbmcgdGhlIGFjdGlvbi5cbiAgICovXG4gIHRva2VuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25FeGVjdXRlRXJyb3JEYXRhIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBoYXMgYmVlbiBleGVjdXRlZC5cbiAgICovXG4gIGFjdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGVycm9yIHdoaWNoIHdhcyBlbmNvdW50ZXJlZFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXJyb3I6IGFueTtcbn1cblxudHlwZSBBY3Rpb25CYWNrbG9nRW50cnkgPSBbc3RyaW5nLCBTdWJqZWN0PHN0cmluZz5dO1xuXG4vKipcbiAqIFRoZSBtYWluIHNlcnZpY2UgZm9yIHdvcmtpbmcgd2l0aCByZUNBUFRDSEEgdjMgQVBJcy5cbiAqXG4gKiBVc2UgdGhlIGBleGVjdXRlYCBtZXRob2QgZm9yIGV4ZWN1dGluZyBhIHNpbmdsZSBhY3Rpb24sIGFuZFxuICogYG9uRXhlY3V0ZWAgb2JzZXJ2YWJsZSBmb3IgbGlzdGVuaW5nIHRvIGFsbCBhY3Rpb25zIGF0IG9uY2UuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZUNhcHRjaGFWM1NlcnZpY2Uge1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2l0ZUtleTogc3RyaW5nO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgYWN0aW9uQmFja2xvZzogQWN0aW9uQmFja2xvZ0VudHJ5W10gfCB1bmRlZmluZWQ7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBub25jZTogc3RyaW5nO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgbGFuZ3VhZ2U/OiBzdHJpbmc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBncmVjYXB0Y2hhOiBSZUNhcHRjaGFWMi5SZUNhcHRjaGE7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIG9uRXhlY3V0ZVN1YmplY3Q6IFN1YmplY3Q8T25FeGVjdXRlRGF0YT47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBvbkV4ZWN1dGVFcnJvclN1YmplY3Q6IFN1YmplY3Q8T25FeGVjdXRlRXJyb3JEYXRhPjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIG9uRXhlY3V0ZU9ic2VydmFibGU6IE9ic2VydmFibGU8T25FeGVjdXRlRGF0YT47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBvbkV4ZWN1dGVFcnJvck9ic2VydmFibGU6IE9ic2VydmFibGU8T25FeGVjdXRlRXJyb3JEYXRhPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB6b25lOiBOZ1pvbmUsXG4gICAgQEluamVjdChSRUNBUFRDSEFfVjNfU0lURV9LRVkpIHNpdGVLZXk6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFJFQ0FQVENIQV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFJFQ0FQVENIQV9OT05DRSkgbm9uY2U/OiBzdHJpbmcsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSRUNBUFRDSEFfTEFOR1VBR0UpIGxhbmd1YWdlPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCk7XG4gICAgdGhpcy5zaXRlS2V5ID0gc2l0ZUtleTtcbiAgICB0aGlzLm5vbmNlID0gbm9uY2U7XG4gICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb25FeGVjdXRlKCk6IE9ic2VydmFibGU8T25FeGVjdXRlRGF0YT4ge1xuICAgIGlmICghdGhpcy5vbkV4ZWN1dGVTdWJqZWN0KSB7XG4gICAgICB0aGlzLm9uRXhlY3V0ZVN1YmplY3QgPSBuZXcgU3ViamVjdDxPbkV4ZWN1dGVEYXRhPigpO1xuICAgICAgdGhpcy5vbkV4ZWN1dGVPYnNlcnZhYmxlID0gdGhpcy5vbkV4ZWN1dGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm9uRXhlY3V0ZU9ic2VydmFibGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9uRXhlY3V0ZUVycm9yKCk6IE9ic2VydmFibGU8T25FeGVjdXRlRXJyb3JEYXRhPiB7XG4gICAgaWYgKCF0aGlzLm9uRXhlY3V0ZUVycm9yU3ViamVjdCkge1xuICAgICAgdGhpcy5vbkV4ZWN1dGVFcnJvclN1YmplY3QgPSBuZXcgU3ViamVjdDxPbkV4ZWN1dGVFcnJvckRhdGE+KCk7XG4gICAgICB0aGlzLm9uRXhlY3V0ZUVycm9yT2JzZXJ2YWJsZSA9IHRoaXMub25FeGVjdXRlRXJyb3JTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm9uRXhlY3V0ZUVycm9yT2JzZXJ2YWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgYGFjdGlvbmAgd2l0aCByZUNBUFRDSEEgdjMgQVBJLlxuICAgKiBVc2UgdGhlIGVtaXR0ZWQgdG9rZW4gdmFsdWUgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyBvbiB0aGUgYmFja2VuZC5cbiAgICpcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcmVDQVBUQ0hBIHYzIGFjdGlvbnMgYW5kIHRva2VucyByZWZlciB0byB0aGUgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBhdFxuICAgKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvZG9jcy92My5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiB0aGUgYWN0aW9uIHRvIGV4ZWN1dGVcbiAgICogQHJldHVybnMge09ic2VydmFibGU8c3RyaW5nPn0gYW4gYE9ic2VydmFibGVgIHRoYXQgd2lsbCBlbWl0IHRoZSByZUNBUFRDSEEgdjMgc3RyaW5nIGB0b2tlbmAgdmFsdWUgd2hlbmV2ZXIgcmVhZHkuXG4gICAqIFRoZSByZXR1cm5lZCBgT2JzZXJ2YWJsZWAgY29tcGxldGVzIGltbWVkaWF0ZWx5IGFmdGVyIGVtaXR0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZXhlY3V0ZShhY3Rpb246IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIGlmICghdGhpcy5ncmVjYXB0Y2hhKSB7XG4gICAgICAgIGlmICghdGhpcy5hY3Rpb25CYWNrbG9nKSB7XG4gICAgICAgICAgdGhpcy5hY3Rpb25CYWNrbG9nID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGlvbkJhY2tsb2cucHVzaChbYWN0aW9uLCBzdWJqZWN0XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb25XaXRoU3ViamVjdChhY3Rpb24sIHN1YmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIGV4ZWN1dGVBY3Rpb25XaXRoU3ViamVjdChhY3Rpb246IHN0cmluZywgc3ViamVjdDogU3ViamVjdDxzdHJpbmc+KTogdm9pZCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgICAgaWYgKHRoaXMub25FeGVjdXRlRXJyb3JTdWJqZWN0KSB7XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBhbnkgYmV0dGVyIGF0IHRoaXMgcG9pbnQsIHVuZm9ydHVuYXRlbHksIHNvIGhhdmUgdG8gcmVzb3J0IHRvIGBhbnlgXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICAgIHRoaXMub25FeGVjdXRlRXJyb3JTdWJqZWN0Lm5leHQoeyBhY3Rpb24sIGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZ3JlY2FwdGNoYS5leGVjdXRlKHRoaXMuc2l0ZUtleSwgeyBhY3Rpb24gfSkudGhlbigodG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgc3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uRXhlY3V0ZVN1YmplY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkV4ZWN1dGVTdWJqZWN0Lm5leHQoeyBhY3Rpb24sIHRva2VuIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBvbkVycm9yKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb25FcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBpbml0KCkge1xuICAgIGlmICh0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgaWYgKFwiZ3JlY2FwdGNoYVwiIGluIHdpbmRvdykge1xuICAgICAgICB0aGlzLmdyZWNhcHRjaGEgPSBncmVjYXB0Y2hhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbGFuZ1BhcmFtID0gdGhpcy5sYW5ndWFnZSA/IFwiJmhsPVwiICsgdGhpcy5sYW5ndWFnZSA6IFwiXCI7XG4gICAgICAgIGxvYWRlci5sb2FkU2NyaXB0KHRoaXMuc2l0ZUtleSwgdGhpcy5vbkxvYWRDb21wbGV0ZSwgbGFuZ1BhcmFtLCB0aGlzLmJhc2VVcmwsIHRoaXMubm9uY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBvbkxvYWRDb21wbGV0ZSA9IChncmVjYXB0Y2hhOiBSZUNhcHRjaGFWMi5SZUNhcHRjaGEpID0+IHtcbiAgICB0aGlzLmdyZWNhcHRjaGEgPSBncmVjYXB0Y2hhO1xuICAgIGlmICh0aGlzLmFjdGlvbkJhY2tsb2cgJiYgdGhpcy5hY3Rpb25CYWNrbG9nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYWN0aW9uQmFja2xvZy5mb3JFYWNoKChbYWN0aW9uLCBzdWJqZWN0XSkgPT4gdGhpcy5leGVjdXRlQWN0aW9uV2l0aFN1YmplY3QoYWN0aW9uLCBzdWJqZWN0KSk7XG4gICAgICB0aGlzLmFjdGlvbkJhY2tsb2cgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xufVxuIl19
|