UNPKG

@hxui/angular

Version:

* * *

263 lines 20.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable, NgZone, InjectionToken } from '@angular/core'; import { fromEvent } from 'rxjs'; import { map, distinctUntilChanged } from 'rxjs/operators'; import { BehaviorSubject } from 'rxjs/index'; /** * @record */ export function WindowSize() { } if (false) { /** @type {?} */ WindowSize.prototype.width; /** @type {?} */ WindowSize.prototype.height; } /** * @record */ export function Breakpoint() { } if (false) { /** @type {?|undefined} */ Breakpoint.prototype.min; /** @type {?|undefined} */ Breakpoint.prototype.max; } /** * @record */ export function BreakpointEvent() { } if (false) { /** @type {?} */ BreakpointEvent.prototype.name; /** @type {?} */ BreakpointEvent.prototype.breakpoint; /** @type {?} */ BreakpointEvent.prototype.size; } /** * @record */ export function BreakpointConfig() { } /** @type {?} */ export var defaultBreakpoints = { mobile: { max: 768 }, tablet: { min: 769, max: 1023 }, desktop: { min: 1024, max: 1215 }, widescreen: { min: 1216, max: 1407 }, fullhd: { min: 1408 } }; /** @type {?} */ var FALLBACK_BREAKPOINT = { min: 0, max: Number.MAX_SAFE_INTEGER }; /** @type {?} */ export var BREAKPOINTS_CONFIG = new InjectionToken('breakpoints.config'); /** * @param {?} ngZone * @param {?} breakpoints * @return {?} */ export function breakpointsFactory(ngZone, breakpoints) { return new BreakpointsService(ngZone, breakpoints); } /** * @param {?=} breakpoints * @return {?} */ export function breakpointsProviders(breakpoints) { if (breakpoints === void 0) { breakpoints = defaultBreakpoints; } return [ { provide: BREAKPOINTS_CONFIG, useValue: breakpoints }, { provide: BreakpointsService, useFactory: breakpointsFactory, deps: [NgZone, BREAKPOINTS_CONFIG] } ]; } var BreakpointsService = /** @class */ (function () { function BreakpointsService(ngZone, breakpoints) { this.ngZone = ngZone; this.lastBreakpoint = null; this.breakpoints = defaultBreakpoints; this.setBreakpoints(breakpoints); this.resize = fromEvent(window, 'resize') .pipe(map(this.getWindowSize), distinctUntilChanged()); /** @type {?} */ var initialBreakpoint = this.getBreakpoint(window.innerWidth); this.changesSubject = new BehaviorSubject(this.getBreakpointEvent(initialBreakpoint)); this.changes = this.changesSubject.pipe(distinctUntilChanged(function (x, y) { return x.name === y.name; })); this.subscribe(); } // Unsubscribe to the resize event // Unsubscribe to the resize event /** * @return {?} */ BreakpointsService.prototype.unsubscribe = // Unsubscribe to the resize event /** * @return {?} */ function () { if (this.subscription) { this.subscription.unsubscribe(); this.subscription = null; } }; // Subscribe to the resize event // Subscribe to the resize event /** * @return {?} */ BreakpointsService.prototype.subscribe = // Subscribe to the resize event /** * @return {?} */ function () { var _this = this; if (this.subscription) { return; } // Make sure resize event doesn't trigger change detection by running outside of angular zone this.ngZone.runOutsideAngular(function () { _this.subscription = _this.resize.subscribe(function (size) { /** @type {?} */ var breakpoint = _this.getBreakpoint(size.width); if (breakpoint === _this.lastBreakpoint) { return; } _this.lastBreakpoint = breakpoint; // Emitting back in angular zone _this.ngZone.run(function () { _this.changesSubject.next(_this.getBreakpointEvent(breakpoint)); }); }); }); }; // Sets the customized breakpoints // Sets the customized breakpoints /** * @param {?=} breakpoints * @return {?} */ BreakpointsService.prototype.setBreakpoints = // Sets the customized breakpoints /** * @param {?=} breakpoints * @return {?} */ function (breakpoints) { if (breakpoints) { this.breakpoints = breakpoints; } }; // Returns a breakpoint event, with the fallback breakpoint if none were found // Returns a breakpoint event, with the fallback breakpoint if none were found /** * @param {?} name * @return {?} */ BreakpointsService.prototype.getBreakpointEvent = // Returns a breakpoint event, with the fallback breakpoint if none were found /** * @param {?} name * @return {?} */ function (name) { if (!name) { return { name: 'default', breakpoint: FALLBACK_BREAKPOINT, size: this.getWindowSize() }; } else { return { name: name, breakpoint: this.breakpoints[name], size: this.getWindowSize() }; } }; // Returns the current window size // Returns the current window size /** * @return {?} */ BreakpointsService.prototype.getWindowSize = // Returns the current window size /** * @return {?} */ function () { return { width: window.innerWidth, height: window.innerHeight }; }; // Returns the first breakpoint that match the current size // Returns the first breakpoint that match the current size /** * @param {?} currentSize * @return {?} */ BreakpointsService.prototype.getBreakpoint = // Returns the first breakpoint that match the current size /** * @param {?} currentSize * @return {?} */ function (currentSize) { var e_1, _a; /** @type {?} */ var keys = Object.keys(this.breakpoints); try { for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) { var key = keys_1_1.value; /** @type {?} */ var value = this.breakpoints[key]; /** @type {?} */ var min = value.min || 0; /** @type {?} */ var max = value.max || Number.MAX_SAFE_INTEGER; if (currentSize >= min && currentSize < max) { return key; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1); } finally { if (e_1) throw e_1.error; } } return null; }; BreakpointsService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ BreakpointsService.ctorParameters = function () { return [ null, { type: undefined } ]; }; return BreakpointsService; }()); export { BreakpointsService }; if (false) { /** @type {?} */ BreakpointsService.prototype.lastBreakpoint; /** @type {?} */ BreakpointsService.prototype.breakpoints; /** @type {?} */ BreakpointsService.prototype.changesSubject; /** @type {?} */ BreakpointsService.prototype.subscription; /** @type {?} */ BreakpointsService.prototype.changes; /** @type {?} */ BreakpointsService.prototype.resize; /** @type {?} */ BreakpointsService.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWtwb2ludC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh4dWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9icmVha3BvaW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFVLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFDLGVBQWUsRUFBMkIsTUFBTSxZQUFZLENBQUM7Ozs7QUF1QnJFLGdDQUdDOzs7SUFGQywyQkFBYzs7SUFDZCw0QkFBZTs7Ozs7QUFHakIsZ0NBR0M7OztJQUZDLHlCQUFhOztJQUNiLHlCQUFhOzs7OztBQUdmLHFDQUlDOzs7SUFIQywrQkFBYTs7SUFDYixxQ0FBdUI7O0lBQ3ZCLCtCQUFpQjs7Ozs7QUFHbkIsc0NBRUM7O0FBRUQsTUFBTSxLQUFPLGtCQUFrQixHQUFxQjtJQUNsRCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtJQUMvQixPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7SUFDakMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0lBQ3BDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7Q0FDdEI7O0lBRUssbUJBQW1CLEdBQUc7SUFDMUIsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtDQUNyQzs7QUFFRCxNQUFNLEtBQU8sa0JB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R0FBRyxHQUFHLEVBQUU7b0JBQzNDLE9BQU8sR0FBRyxDQUFDO2lCQUNaO2FBQ0Y7Ozs7Ozs7OztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Z0JBMUdGLFVBQVU7Ozs7Ozs7SUEyR1gseUJBQUM7Q0FBQSxBQTNHRCxJQTJHQztTQTFHWSxrQkFBa0I7OztJQUU3Qiw0Q0FBc0M7O0lBQ3RDLHlDQUEyRDs7SUFDM0QsNENBQXlEOztJQUN6RCwwQ0FBbUM7O0lBRW5DLHFDQUFxQzs7SUFDckMsb0NBQStCOztJQUVsQixvQ0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMvaW5kZXgnO1xyXG5cclxuXHJcbi8vIEBleGFtcGxlXHJcbi8vIGltcG9ydCB7IGJyZWFrcG9pbnRzUHJvdmlkZXIsIEJyZWFrcG9pbnRzU2VydmljZSwgQnJlYWtwb2ludEV2ZW50IH0gZnJvbSAnYW5ndWxhci1icmVha3BvaW50cyc7XHJcbi8vXHJcbi8vIEBDb21wb25lbnQoe1xyXG4vLyAgIC8vIC4uLlxyXG4vLyAgIHByb3ZpZGVyczogW2JyZWFrcG9pbnRzUHJvdmlkZXIoKV1cclxuLy8gICAvLyAuLi5cclxuLy8gfSlcclxuLy8gZXhwb3J0IGNsYXNzIFlvdXJDb21wb25lbnQge1xyXG4vL1xyXG4vLyAgIGNvbnN0cnVjdG9yIChwcml2YXRlIGJyZWFrcG9pbnRzU2VydmljZTogQnJlYWtwb2ludHNTZXJ2aWNlKSB7XHJcbi8vXHJcbi8vICAgICB0aGlzLmJyZWFrcG9pbnRzU2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSgoZXZlbnQ6IEJyZWFrcG9pbnRFdmVudCkgPT4ge1xyXG4vL1xyXG4vLyAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbi8vICAgICB9KTtcclxuLy8gICB9XHJcbi8vIH1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFdpbmRvd1NpemUge1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJlYWtwb2ludCB7XHJcbiAgbWluPzogbnVtYmVyO1xyXG4gIG1heD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCcmVha3BvaW50RXZlbnQge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBicmVha3BvaW50OiBCcmVha3BvaW50O1xyXG4gIHNpemU6IFdpbmRvd1NpemU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJlYWtwb2ludENvbmZpZyB7XHJcbiAgW25hbWU6IHN0cmluZ106IEJyZWFrcG9pbnQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0QnJlYWtwb2ludHM6IEJyZWFrcG9pbnRDb25maWcgPSB7XHJcbiAgbW9iaWxlOiB7IG1heDogNzY4IH0sXHJcbiAgdGFibGV0OiB7IG1pbjogNzY5LCBtYXg6IDEwMjMgfSxcclxuICBkZXNrdG9wOiB7IG1pbjogMTAyNCwgbWF4OiAxMjE1IH0sXHJcbiAgd2lkZXNjcmVlbjogeyBtaW46IDEyMTYsIG1heDogMTQwNyB9LFxyXG4gIGZ1bGxoZDogeyBtaW46IDE0MDggfVxyXG59O1xyXG5cclxuY29uc3QgRkFMTEJBQ0tfQlJFQUtQT0lOVCA9IHtcclxuICBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEJSRUFLUE9JTlRTX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxCcmVha3BvaW50Q29uZmlnPignYnJlYWtwb2ludHMuY29uZmlnJyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnJlYWtwb2ludHNGYWN0b3J5IChuZ1pvbmU6IE5nWm9uZSwgYnJlYWtwb2ludHM6IEJyZWFrcG9pbnRDb25maWcpIHtcclxuICByZXR1cm4gbmV3IEJyZWFrcG9pbnRzU2VydmljZShuZ1pvbmUsIGJyZWFrcG9pbnRzKVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJyZWFrcG9pbnRzUHJvdmlkZXJzIChicmVha3BvaW50czogQnJlYWtwb2ludENvbmZpZyA9IGRlZmF1bHRCcmVha3BvaW50cyk6IFByb3ZpZGVyW10ge1xyXG4gIHJldHVybiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IEJSRUFLUE9JTlRTX0NPTkZJRyxcclxuICAgICAgdXNlVmFsdWU6IGJyZWFrcG9pbnRzXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBCcmVha3BvaW50c1NlcnZpY2UsXHJcbiAgICAgIHVzZUZhY3Rvcnk6IGJyZWFrcG9pbnRzRmFjdG9yeSxcclxuICAgICAgZGVwczogW05nWm9uZSwgQlJFQUtQT0lOVFNfQ09ORklHXVxyXG4gICAgfVxyXG4gIF07XHJcbn1cclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCcmVha3BvaW50c1NlcnZpY2UgIHtcclxuXHJcbiAgcHJpdmF0ZSBsYXN0QnJlYWtwb2ludDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIGJyZWFrcG9pbnRzOiBCcmVha3BvaW50Q29uZmlnID0gZGVmYXVsdEJyZWFrcG9pbnRzO1xyXG4gIHByaXZhdGUgY2hhbmdlc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCcmVha3BvaW50RXZlbnQ+O1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNoYW5nZXM6IE9ic2VydmFibGU8QnJlYWtwb2ludEV2ZW50PjtcclxuICByZXNpemU6IE9ic2VydmFibGU8V2luZG93U2l6ZT47XHJcblxyXG4gIGNvbnN0cnVjdG9yIChwcml2YXRlIG5nWm9uZSwgYnJlYWtwb2ludHM/OiBCcmVha3BvaW50Q29uZmlnKSB7XHJcblxyXG4gICAgdGhpcy5zZXRCcmVha3BvaW50cyhicmVha3BvaW50cyk7XHJcblxyXG4gICAgdGhpcy5yZXNpemUgPSBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHRoaXMuZ2V0V2luZG93U2l6ZSksXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxyXG4gICAgICApO1xyXG5cclxuICAgIGNvbnN0IGluaXRpYWxCcmVha3BvaW50ID0gdGhpcy5nZXRCcmVha3BvaW50KHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuY2hhbmdlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJyZWFrcG9pbnRFdmVudD4odGhpcy5nZXRCcmVha3BvaW50RXZlbnQoaW5pdGlhbEJyZWFrcG9pbnQpKTtcclxuICAgIHRoaXMuY2hhbmdlcyA9IHRoaXMuY2hhbmdlc1N1YmplY3QucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoeCwgeSkgPT4geC5uYW1lID09PSB5Lm5hbWUpKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVbnN1YnNjcmliZSB0byB0aGUgcmVzaXplIGV2ZW50XHJcbiAgcHVibGljIHVuc3Vic2NyaWJlICgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU3Vic2NyaWJlIHRvIHRoZSByZXNpemUgZXZlbnRcclxuICBwdWJsaWMgc3Vic2NyaWJlICgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1ha2Ugc3VyZSByZXNpemUgZXZlbnQgZG9lc24ndCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gYnkgcnVubmluZyBvdXRzaWRlIG9mIGFuZ3VsYXIgem9uZVxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnJlc2l6ZS5zdWJzY3JpYmUoKHNpemU6IFdpbmRvd1NpemUpID0+IHtcclxuXHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludDogc3RyaW5nID0gdGhpcy5nZXRCcmVha3BvaW50KHNpemUud2lkdGgpO1xyXG5cclxuICAgICAgICBpZiAoYnJlYWtwb2ludCA9PT0gdGhpcy5sYXN0QnJlYWtwb2ludCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sYXN0QnJlYWtwb2ludCA9IGJyZWFrcG9pbnQ7XHJcblxyXG4gICAgICAgIC8vIEVtaXR0aW5nIGJhY2sgaW4gYW5ndWxhciB6b25lXHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlc1N1YmplY3QubmV4dCh0aGlzLmdldEJyZWFrcG9pbnRFdmVudChicmVha3BvaW50KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8gU2V0cyB0aGUgY3VzdG9taXplZCBicmVha3BvaW50c1xyXG4gIHByaXZhdGUgc2V0QnJlYWtwb2ludHMgKGJyZWFrcG9pbnRzPzogQnJlYWtwb2ludENvbmZpZykge1xyXG5cclxuICAgIGlmIChicmVha3BvaW50cykge1xyXG4gICAgICB0aGlzLmJyZWFrcG9pbnRzID0gYnJlYWtwb2ludHM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gUmV0dXJucyBhIGJyZWFrcG9pbnQgZXZlbnQsIHdpdGggdGhlIGZhbGxiYWNrIGJyZWFrcG9pbnQgaWYgbm9uZSB3ZXJlIGZvdW5kXHJcbiAgcHJpdmF0ZSBnZXRCcmVha3BvaW50RXZlbnQgKG5hbWU6IHN0cmluZyk6IEJyZWFrcG9pbnRFdmVudCB7XHJcblxyXG4gICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgIHJldHVybiB7IG5hbWU6ICdkZWZhdWx0JywgYnJlYWtwb2ludDogRkFMTEJBQ0tfQlJFQUtQT0lOVCwgc2l6ZTogdGhpcy5nZXRXaW5kb3dTaXplKCkgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IG5hbWU6IG5hbWUsIGJyZWFrcG9pbnQ6IHRoaXMuYnJlYWtwb2ludHNbbmFtZV0sIHNpemU6IHRoaXMuZ2V0V2luZG93U2l6ZSgpIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHdpbmRvdyBzaXplXHJcbiAgcHJpdmF0ZSBnZXRXaW5kb3dTaXplICgpOiBXaW5kb3dTaXplIHtcclxuXHJcbiAgICByZXR1cm4geyB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0IH07XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gUmV0dXJucyB0aGUgZmlyc3QgYnJlYWtwb2ludCB0aGF0IG1hdGNoIHRoZSBjdXJyZW50IHNpemVcclxuICBwcml2YXRlIGdldEJyZWFrcG9pbnQgKGN1cnJlbnRTaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmJyZWFrcG9pbnRzKTtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJyZWFrcG9pbnRzW2tleV07XHJcbiAgICAgIGNvbnN0IG1pbiA9IHZhbHVlLm1pbiB8fCAwO1xyXG4gICAgICBjb25zdCBtYXggPSB2YWx1ZS5tYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XHJcblxyXG4gICAgICBpZiAoY3VycmVudFNpemUgPj0gbWluICYmIGN1cnJlbnRTaXplIDwgbWF4KSB7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=