UNPKG

ngx-intercom-messenger

Version:

This is an Intercom wrapper for Angular 18+ which supports AoTx

142 lines 17.6 kB
import { Injectable, PLATFORM_ID, inject, InjectionToken } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import { Intercom, getVisitorId, hide, onHide, onShow, onUnreadCountChange, show, showArticle, showMessages, showNewMessage, shutdown, startTour, trackEvent, update, } from "@intercom/messenger-js-sdk"; import * as i0 from "@angular/core"; export const INTERCOM_MESSENGER_SETTINGS = new InjectionToken(''); /** * A provider with every Intercom.JS method */ export class IntercomMessengerService { platformId = inject(PLATFORM_ID); settings = inject(INTERCOM_MESSENGER_SETTINGS); /** * If you'd like to control when Intercom is loaded, you can use the 'boot' method. * This is useful in situations like a one-page Javascript based application where the user may not be logged in * when the page loads. You call this method with the standard intercomSettings object. */ boot(settings) { if (!isPlatformBrowser(this.platformId)) { return; } const app_id = settings?.app_id ?? this.settings?.app_id; if (!app_id) { throw new Error('Please provide Intercom app_id either in module config or in the `boot()` method'); } Intercom(settings ?? this.settings); } /** * If you have the Respond product (combined with another product like Engage) * you should call the Intercom shutdown method to clear your users’ conversations anytime they log out * of your application. Otherwise, the cookie we use to track who was most recently logged in on a given device * or computer will keep these conversations in the Messenger for one week. * This method will effectively clear out any user data that you have been passing through the JS API. */ shutdown() { return shutdown(); } /** * Calling the update method without any other arguments will trigger the JavaScript to look for new messages * that should be displayed to the current user (the one whose details are in the window.intercomSettings variable) * and show them if they exist. * * Calling the update method with a JSON object of user details will update those fields on the current user * in addition to logging an impression at the current URL and looking for new messages for the user. */ update(data) { return update(data); } /** * This will hide the main Messenger panel if it is open. It will not hide the Messenger Launcher. */ hide() { return hide(); } /** * This will show the Messenger. If there are no conversations it will open with the new message view, * if there are it will open with the message list. * * If a `message` parameter is supplied, it will automatically open a new message window, aliasing showNewMessage(). * */ show(message) { if (message) { return this.showNewMessage(message); } return show(); } /** * To open the message window with the message list you can call `showMessages()`. */ showMessages() { return showMessages(); } /** * To open the message window with the new message view you can call showNewMessage(). * * This function takes an optional parameter that can be used to pre-populate the message composer as shown below. */ showNewMessage(message) { return showNewMessage(message ?? ''); } /** * You can submit an event using the trackEvent method. * This will associate the event with the currently logged-in user and send it to Intercom. * The final parameter is a map that can be used to send optional metadata about the event. * * You can also add custom information to events in the form of event metadata. */ trackEvent(eventName, metadata) { return trackEvent(eventName, metadata); } /** * A visitor is someone who goes to your site but does not use the messenger. * You can track these visitors via the visitor user_id. * This user_id can be used to retrieve the visitor or lead through the REST API. */ getVisitorId() { return getVisitorId(); } /** * Gives you the ability to hook into the show event. Requires a function argument. */ onShow(handler) { return onShow(handler); } /** * Gives you the ability to hook into the hide event. Requires a function argument. */ onHide(handler) { return onHide(handler); } /** * This method allows you to register a function that will be called when the current number of unread messages changes. */ onUnreadCountChange(handler) { return onUnreadCountChange(handler); } /** * If you would like to trigger a tour based on an action a user or visitor takes in your site or application, * ou can use this API method. You need to call this method with the id of the tour you wish to show. The id of * the tour can be found in the “Use tour everywhere” section of the tour editor. * * Please note that tours shown via this API must be published and the “Use tour everywhere” section must be * turned on. If you're calling this API using an invalid tour id, nothing will happen. */ startTour(tourId) { return startTour(tourId); } /** * If you would like to trigger an article in the Messenger, you can use the showArticle method. * The article will be shown within the Messenger, and clicking the Messenger back button will return to the previous context. * If the Messenger is closed when the method is called, it will be opened first and then the article will be shown. */ showArticle(articleId) { return showArticle(articleId); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IntercomMessengerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IntercomMessengerService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IntercomMessengerService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjb20tbWVzc2VuZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25neC1pbnRlcmNvbS1tZXNzZW5nZXIvc3JjL2xpYi9pbnRlcmNvbS1tZXNzZW5nZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ25ELE9BQU8sRUFDTCxRQUFRLEVBQ1IsWUFBWSxFQUNaLElBQUksRUFDSixNQUFNLEVBQ04sTUFBTSxFQUNOLG1CQUFtQixFQUNuQixJQUFJLEVBQ0osV0FBVyxFQUNYLFlBQVksRUFDWixjQUFjLEVBQ2QsUUFBUSxFQUNSLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxHQUNQLE1BQU0sNEJBQTRCLENBQUM7O0FBR3BDLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLElBQUksY0FBYyxDQUFtQixFQUFFLENBQUMsQ0FBQTtBQUVuRjs7R0FFRztBQUVILE1BQU0sT0FBTyx3QkFBd0I7SUFDM0IsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxRQUFRLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFFdkQ7Ozs7T0FJRztJQUNJLElBQUksQ0FBQyxRQUEyQjtRQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTTtRQUNSLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFBO1FBQ3hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsa0ZBQWtGLENBQUMsQ0FBQTtRQUNyRyxDQUFDO1FBQ0QsUUFBUSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFFBQVE7UUFDYixPQUFPLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLElBQWM7UUFDMUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSTtRQUNULE9BQU8sSUFBSSxFQUFFLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksSUFBSSxDQUFDLE9BQWdCO1FBQzFCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDckMsQ0FBQztRQUNELE9BQU8sSUFBSSxFQUFFLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sWUFBWSxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjLENBQUMsT0FBZ0I7UUFDcEMsT0FBTyxjQUFjLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxVQUFVLENBQUMsU0FBaUIsRUFBRSxRQUFvRDtRQUN2RixPQUFPLFVBQVUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sWUFBWSxFQUF1QixDQUFBO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxPQUFtQjtRQUMvQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBbUI7UUFDL0IsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CLENBQUMsT0FBdUM7UUFDaEUsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFNBQVMsQ0FBQyxNQUFjO1FBQzdCLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLFNBQWlCO1FBQ2xDLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQy9CLENBQUM7dUdBNUlVLHdCQUF3QjsyR0FBeEIsd0JBQXdCOzsyRkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQsIGluamVjdCwgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nXG5pbXBvcnQge1xuICBJbnRlcmNvbSxcbiAgZ2V0VmlzaXRvcklkLFxuICBoaWRlLFxuICBvbkhpZGUsXG4gIG9uU2hvdyxcbiAgb25VbnJlYWRDb3VudENoYW5nZSxcbiAgc2hvdyxcbiAgc2hvd0FydGljbGUsXG4gIHNob3dNZXNzYWdlcyxcbiAgc2hvd05ld01lc3NhZ2UsXG4gIHNodXRkb3duLFxuICBzdGFydFRvdXIsXG4gIHRyYWNrRXZlbnQsXG4gIHVwZGF0ZSxcbn0gZnJvbSBcIkBpbnRlcmNvbS9tZXNzZW5nZXItanMtc2RrXCI7XG5pbXBvcnQgdHlwZSB7IFVzZXJBcmdzLCBJbnRlcmNvbVNldHRpbmdzIH0gZnJvbSBcIkBpbnRlcmNvbS9tZXNzZW5nZXItanMtc2RrL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBJTlRFUkNPTV9NRVNTRU5HRVJfU0VUVElOR1MgPSBuZXcgSW5qZWN0aW9uVG9rZW48SW50ZXJjb21TZXR0aW5ncz4oJycpXG5cbi8qKlxuICogQSBwcm92aWRlciB3aXRoIGV2ZXJ5IEludGVyY29tLkpTIG1ldGhvZFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW50ZXJjb21NZXNzZW5nZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcbiAgcHJpdmF0ZSBzZXR0aW5ncyA9IGluamVjdChJTlRFUkNPTV9NRVNTRU5HRVJfU0VUVElOR1MpO1xuXG4gIC8qKlxuICAgKiBJZiB5b3UnZCBsaWtlIHRvIGNvbnRyb2wgd2hlbiBJbnRlcmNvbSBpcyBsb2FkZWQsIHlvdSBjYW4gdXNlIHRoZSAnYm9vdCcgbWV0aG9kLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIGxpa2UgYSBvbmUtcGFnZSBKYXZhc2NyaXB0IGJhc2VkIGFwcGxpY2F0aW9uIHdoZXJlIHRoZSB1c2VyIG1heSBub3QgYmUgbG9nZ2VkIGluXG4gICAqIHdoZW4gdGhlIHBhZ2UgbG9hZHMuIFlvdSBjYWxsIHRoaXMgbWV0aG9kIHdpdGggdGhlIHN0YW5kYXJkIGludGVyY29tU2V0dGluZ3Mgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGJvb3Qoc2V0dGluZ3M/OiBJbnRlcmNvbVNldHRpbmdzKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgYXBwX2lkID0gc2V0dGluZ3M/LmFwcF9pZCA/PyB0aGlzLnNldHRpbmdzPy5hcHBfaWRcbiAgICBpZiAoIWFwcF9pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBJbnRlcmNvbSBhcHBfaWQgZWl0aGVyIGluIG1vZHVsZSBjb25maWcgb3IgaW4gdGhlIGBib290KClgIG1ldGhvZCcpXG4gICAgfVxuICAgIEludGVyY29tKHNldHRpbmdzID8/IHRoaXMuc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHlvdSBoYXZlIHRoZSBSZXNwb25kIHByb2R1Y3QgKGNvbWJpbmVkIHdpdGggYW5vdGhlciBwcm9kdWN0IGxpa2UgRW5nYWdlKVxuICAgKiB5b3Ugc2hvdWxkIGNhbGwgdGhlIEludGVyY29tIHNodXRkb3duIG1ldGhvZCB0byBjbGVhciB5b3VyIHVzZXJz4oCZIGNvbnZlcnNhdGlvbnMgYW55dGltZSB0aGV5IGxvZyBvdXRcbiAgICogb2YgeW91ciBhcHBsaWNhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgY29va2llIHdlIHVzZSB0byB0cmFjayB3aG8gd2FzIG1vc3QgcmVjZW50bHkgbG9nZ2VkIGluIG9uIGEgZ2l2ZW4gZGV2aWNlXG4gICAqIG9yIGNvbXB1dGVyIHdpbGwga2VlcCB0aGVzZSBjb252ZXJzYXRpb25zIGluIHRoZSBNZXNzZW5nZXIgZm9yIG9uZSB3ZWVrLlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGVmZmVjdGl2ZWx5IGNsZWFyIG91dCBhbnkgdXNlciBkYXRhIHRoYXQgeW91IGhhdmUgYmVlbiBwYXNzaW5nIHRocm91Z2ggdGhlIEpTIEFQSS5cbiAgICovXG4gIHB1YmxpYyBzaHV0ZG93bigpOiB2b2lkIHtcbiAgICByZXR1cm4gc2h1dGRvd24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsaW5nIHRoZSB1cGRhdGUgbWV0aG9kIHdpdGhvdXQgYW55IG90aGVyIGFyZ3VtZW50cyB3aWxsIHRyaWdnZXIgdGhlIEphdmFTY3JpcHQgdG8gbG9vayBmb3IgbmV3IG1lc3NhZ2VzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgY3VycmVudCB1c2VyICh0aGUgb25lIHdob3NlIGRldGFpbHMgYXJlIGluIHRoZSB3aW5kb3cuaW50ZXJjb21TZXR0aW5ncyB2YXJpYWJsZSlcbiAgICogYW5kIHNob3cgdGhlbSBpZiB0aGV5IGV4aXN0LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoZSB1cGRhdGUgbWV0aG9kIHdpdGggYSBKU09OIG9iamVjdCBvZiB1c2VyIGRldGFpbHMgd2lsbCB1cGRhdGUgdGhvc2UgZmllbGRzIG9uIHRoZSBjdXJyZW50IHVzZXJcbiAgICogaW4gYWRkaXRpb24gdG8gbG9nZ2luZyBhbiBpbXByZXNzaW9uIGF0IHRoZSBjdXJyZW50IFVSTCBhbmQgbG9va2luZyBmb3IgbmV3IG1lc3NhZ2VzIGZvciB0aGUgdXNlci5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoZGF0YTogVXNlckFyZ3MpIHtcbiAgICByZXR1cm4gdXBkYXRlKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyB3aWxsIGhpZGUgdGhlIG1haW4gTWVzc2VuZ2VyIHBhbmVsIGlmIGl0IGlzIG9wZW4uIEl0IHdpbGwgbm90IGhpZGUgdGhlIE1lc3NlbmdlciBMYXVuY2hlci5cbiAgICovXG4gIHB1YmxpYyBoaWRlKCkge1xuICAgIHJldHVybiBoaWRlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgc2hvdyB0aGUgTWVzc2VuZ2VyLiBJZiB0aGVyZSBhcmUgbm8gY29udmVyc2F0aW9ucyBpdCB3aWxsIG9wZW4gd2l0aCB0aGUgbmV3IG1lc3NhZ2UgdmlldyxcbiAgICogaWYgdGhlcmUgYXJlIGl0IHdpbGwgb3BlbiB3aXRoIHRoZSBtZXNzYWdlIGxpc3QuXG4gICAqXG4gICAqIElmIGEgYG1lc3NhZ2VgIHBhcmFtZXRlciBpcyBzdXBwbGllZCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gYSBuZXcgbWVzc2FnZSB3aW5kb3csIGFsaWFzaW5nIHNob3dOZXdNZXNzYWdlKCkuXG4gICAqXG4gICAqL1xuICBwdWJsaWMgc2hvdyhtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dOZXdNZXNzYWdlKG1lc3NhZ2UpXG4gICAgfVxuICAgIHJldHVybiBzaG93KClcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBvcGVuIHRoZSBtZXNzYWdlIHdpbmRvdyB3aXRoIHRoZSBtZXNzYWdlIGxpc3QgeW91IGNhbiBjYWxsIGBzaG93TWVzc2FnZXMoKWAuXG4gICAqL1xuICBwdWJsaWMgc2hvd01lc3NhZ2VzKCk6IHZvaWQge1xuICAgIHJldHVybiBzaG93TWVzc2FnZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRvIG9wZW4gdGhlIG1lc3NhZ2Ugd2luZG93IHdpdGggdGhlIG5ldyBtZXNzYWdlIHZpZXcgeW91IGNhbiBjYWxsIHNob3dOZXdNZXNzYWdlKCkuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHRoZSBtZXNzYWdlIGNvbXBvc2VyIGFzIHNob3duIGJlbG93LlxuICAgKi9cbiAgcHVibGljIHNob3dOZXdNZXNzYWdlKG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gc2hvd05ld01lc3NhZ2UobWVzc2FnZSA/PyAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHN1Ym1pdCBhbiBldmVudCB1c2luZyB0aGUgdHJhY2tFdmVudCBtZXRob2QuXG4gICAqIFRoaXMgd2lsbCBhc3NvY2lhdGUgdGhlIGV2ZW50IHdpdGggdGhlIGN1cnJlbnRseSBsb2dnZWQtaW4gdXNlciBhbmQgc2VuZCBpdCB0byBJbnRlcmNvbS5cbiAgICogVGhlIGZpbmFsIHBhcmFtZXRlciBpcyBhIG1hcCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlbmQgb3B0aW9uYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gYWRkIGN1c3RvbSBpbmZvcm1hdGlvbiB0byBldmVudHMgaW4gdGhlIGZvcm0gb2YgZXZlbnQgbWV0YWRhdGEuXG4gICAqL1xuICBwdWJsaWMgdHJhY2tFdmVudChldmVudE5hbWU6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuPik6IHZvaWQge1xuICAgIHJldHVybiB0cmFja0V2ZW50KGV2ZW50TmFtZSwgbWV0YWRhdGEpXG4gIH1cblxuICAvKipcbiAgICogQSB2aXNpdG9yIGlzIHNvbWVvbmUgd2hvIGdvZXMgdG8geW91ciBzaXRlIGJ1dCBkb2VzIG5vdCB1c2UgdGhlIG1lc3Nlbmdlci5cbiAgICogWW91IGNhbiB0cmFjayB0aGVzZSB2aXNpdG9ycyB2aWEgdGhlIHZpc2l0b3IgdXNlcl9pZC5cbiAgICogVGhpcyB1c2VyX2lkIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSB2aXNpdG9yIG9yIGxlYWQgdGhyb3VnaCB0aGUgUkVTVCBBUEkuXG4gICAqL1xuICBwdWJsaWMgZ2V0VmlzaXRvcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldFZpc2l0b3JJZCgpIGFzIHVua25vd24gYXMgc3RyaW5nXG4gIH1cblxuICAvKipcbiAgICogR2l2ZXMgeW91IHRoZSBhYmlsaXR5IHRvIGhvb2sgaW50byB0aGUgc2hvdyBldmVudC4gUmVxdWlyZXMgYSBmdW5jdGlvbiBhcmd1bWVudC5cbiAgICovXG4gIHB1YmxpYyBvblNob3coaGFuZGxlcjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHJldHVybiBvblNob3coaGFuZGxlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlcyB5b3UgdGhlIGFiaWxpdHkgdG8gaG9vayBpbnRvIHRoZSBoaWRlIGV2ZW50LiBSZXF1aXJlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50LlxuICAgKi9cbiAgcHVibGljIG9uSGlkZShoYW5kbGVyOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgcmV0dXJuIG9uSGlkZShoYW5kbGVyKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHVucmVhZCBtZXNzYWdlcyBjaGFuZ2VzLlxuICAgKi9cbiAgcHVibGljIG9uVW5yZWFkQ291bnRDaGFuZ2UoaGFuZGxlcjogKHVucmVhZENvdW50PzogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgcmV0dXJuIG9uVW5yZWFkQ291bnRDaGFuZ2UoaGFuZGxlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB5b3Ugd291bGQgbGlrZSB0byB0cmlnZ2VyIGEgdG91ciBiYXNlZCBvbiBhbiBhY3Rpb24gYSB1c2VyIG9yIHZpc2l0b3IgdGFrZXMgaW4geW91ciBzaXRlIG9yIGFwcGxpY2F0aW9uLFxuICAgKiBvdSBjYW4gdXNlIHRoaXMgQVBJIG1ldGhvZC4gWW91IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aXRoIHRoZSBpZCBvZiB0aGUgdG91ciB5b3Ugd2lzaCB0byBzaG93LiBUaGUgaWQgb2ZcbiAgICogdGhlIHRvdXIgY2FuIGJlIGZvdW5kIGluIHRoZSDigJxVc2UgdG91ciBldmVyeXdoZXJl4oCdIHNlY3Rpb24gb2YgdGhlIHRvdXIgZWRpdG9yLlxuICAgKlxuICAgKiBQbGVhc2Ugbm90ZSB0aGF0IHRvdXJzIHNob3duIHZpYSB0aGlzIEFQSSBtdXN0IGJlIHB1Ymxpc2hlZCBhbmQgdGhlIOKAnFVzZSB0b3VyIGV2ZXJ5d2hlcmXigJ0gc2VjdGlvbiBtdXN0IGJlXG4gICAqIHR1cm5lZCBvbi4gSWYgeW91J3JlIGNhbGxpbmcgdGhpcyBBUEkgdXNpbmcgYW4gaW52YWxpZCB0b3VyIGlkLCBub3RoaW5nIHdpbGwgaGFwcGVuLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0VG91cih0b3VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiBzdGFydFRvdXIodG91cklkKVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIHRyaWdnZXIgYW4gYXJ0aWNsZSBpbiB0aGUgTWVzc2VuZ2VyLCB5b3UgY2FuIHVzZSB0aGUgc2hvd0FydGljbGUgbWV0aG9kLlxuICAgKiBUaGUgYXJ0aWNsZSB3aWxsIGJlIHNob3duIHdpdGhpbiB0aGUgTWVzc2VuZ2VyLCBhbmQgY2xpY2tpbmcgdGhlIE1lc3NlbmdlciBiYWNrIGJ1dHRvbiB3aWxsIHJldHVybiB0byB0aGUgcHJldmlvdXMgY29udGV4dC5cbiAgICogSWYgdGhlIE1lc3NlbmdlciBpcyBjbG9zZWQgd2hlbiB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgaXQgd2lsbCBiZSBvcGVuZWQgZmlyc3QgYW5kIHRoZW4gdGhlIGFydGljbGUgd2lsbCBiZSBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93QXJ0aWNsZShhcnRpY2xlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiBzaG93QXJ0aWNsZShhcnRpY2xlSWQpXG4gIH1cblxufVxuIl19