UNPKG

@uex/web-extensions

Version:

Uex extensions for Angular 6+ web projects

535 lines 45.3 kB
/** * @fileoverview added by tsickle * Generated from: lib/modules/template/template.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, HostListener, ContentChildren, ContentChild, QueryList, ViewChild, EventEmitter, Input } from "@angular/core"; import { ActivatedRoute, PRIMARY_OUTLET } from "@angular/router"; import * as _ from "lodash"; import { DeviceDetectorService } from "ngx-device-detector"; import { ConfigService } from "../../config.service"; import { ActionBarComponent } from "./components/action-bar.component"; import { FormBarComponent } from "./components/form-bar.component"; import { TemplateSize, TemplateTheme } from "./template.enum"; import { LayoutRouterService } from "../layout/services/router.service"; /** @type {?} */ const ROUTE_DATA_BREADCRUMB = "$title"; export class TemplateComponent { /** * @param {?} _route * @param {?} _deviceService * @param {?} _config * @param {?} _layoutRouterService * @param {?} elementRef */ constructor(_route, _deviceService, _config, _layoutRouterService, elementRef) { this._route = _route; this._deviceService = _deviceService; this._config = _config; this._layoutRouterService = _layoutRouterService; this.elementRef = elementRef; this.type = "default"; this.size = TemplateSize.RESPONSIVE; this.onSizeChange = new EventEmitter(); this.onScroll = new EventEmitter(); this.breakPoints = [ "xs", "sm", "md", "lg", "xl" ]; this.sizes = { width: 0, height: 0, header_height: 0, offset_height: 0 }; this.scrollRef = { top: 0, left: 0 }; this.relative = false; this._device_info = this._deviceService.getDeviceInfo(); } /** * @private * @param {?} action_bars * @return {?} */ set _actionBars(action_bars) { setTimeout((/** * @return {?} */ () => (this.actionBars = action_bars.toArray())), 0); } /** * @private * @param {?} form_bar * @return {?} */ set _formBar(form_bar) { setTimeout((/** * @return {?} */ () => (this.formBar = form_bar)), 0); } /** * @return {?} */ _onResize() { this.resize(); } /** * @return {?} */ _onScroll() { this.scrollRef = { top: this._getScrollElement().scrollTop, left: this._getScrollElement().scrollLeft }; this.onScroll.emit(this.scrollRef); } /** * @return {?} */ ngOnInit() { this._layoutRouterService.registerTemplate(this); } /** * @return {?} */ ngOnDestroy() { this._layoutRouterService.unregisterTemplate(); } /** * @return {?} */ ngAfterViewInit() { setTimeout((/** * @return {?} */ () => { if (!this.title) { /** @type {?} */ const root = this._route.root; this.title = this._getActiveRoute(root).snapshot.data[ROUTE_DATA_BREADCRUMB]; } this.resize(); this._updateData(); }), 0); } /** * @return {?} */ ngOnChanges() { this._updateData(); } /** * @param {?} offset * @param {?=} smooth * @return {?} */ scrollTo(offset, smooth = false) { if (this.hasScroll()) { this._getScrollElement().scroll({ top: offset, behavior: smooth ? "smooth" : "auto" }); } } /** * @param {?} anchor * @param {?=} smooth * @return {?} */ scrollToAnchor(anchor, smooth = false) { if (this.hasScroll()) { if (anchor.indexOf("#") !== 0) { anchor = `#${anchor}`; } /** @type {?} */ const el = this.elementRef.nativeElement.querySelector(anchor); if (!el) { return; } this.scrollTo(((/** @type {?} */ (el))).offsetTop, smooth); } } /** * @param {?=} smooth * @return {?} */ scrollToTop(smooth = false) { if (this.hasScroll()) { this._getScrollElement().scroll({ top: 0, behavior: smooth ? "smooth" : "auto" }); } } /** * @param {?=} smooth * @return {?} */ scrollToBottom(smooth = false) { if (this.hasScroll()) { this._getScrollElement().scroll({ top: this._getScrollElement().scrollHeight, behavior: smooth ? "smooth" : "auto" }); } } /** * @return {?} */ resize() { this._setBreakPoint(); this._setSizes(); } /** * @param {?} size * @return {?} */ isBreakPoint(size) { return this.breakPoint == size; } /** * @param {?} size * @return {?} */ isBreakPointMin(size) { return (this.breakPoints.indexOf(size) <= this.breakPoints.indexOf(this.breakPoint)); } /** * @param {?} size * @return {?} */ isBreakPointMax(size) { return (this.breakPoints.indexOf(size) >= this.breakPoints.indexOf(this.breakPoint)); } /** * @param {?} path * @return {?} */ getConfig(path) { if (!this.type) { this.type = "default"; } if (this._config) { /** @type {?} */ const template_type = this._config.template[this.type] || this._config.template["1"] || this._config.template.default; if (!template_type) return null; switch (path) { case "background.color": return template_type.background.color; case "background.image": return template_type.background.image ? `url("${template_type.background.image}")` : null; default: return _.get(template_type, path); } } else { return null; } } /** * @param {?} theme_type * @return {?} */ isTheme(theme_type) { return this.getConfig("theme") == TemplateTheme[theme_type]; } /** * @return {?} */ hasFormBar() { // return this.has_form_bar; return this.formBar && this.formBar.content ? true : false; } /** * @return {?} */ hasActionBar() { return this.actionBars && this.actionBars.length > 0; } /** * @return {?} */ hasScroll() { if (this._wrapper) { /** @type {?} */ const el = this._getScrollElement(true); // const wrapper = this._wrapper.nativeElement.childNodes[0]; /** @type {?} */ const wrapper = this._wrapper.nativeElement; return wrapper.offsetHeight > el.offsetHeight; } return false; } /** * @private * @param {?=} use_body * @return {?} */ _getScrollElement(use_body = false) { /** @type {?} */ const is_safari = this._device_info.browser == "safari"; return this._config.layout.relative ? use_body || is_safari ? document.body : document.documentElement : this.elementRef.nativeElement; } /** * @private * @return {?} */ _setBreakPoint() { /** @type {?} */ const width = document.body.clientWidth; switch (true) { case width < 576: this.breakPoint = "xs"; break; case width >= 576 && width < 768: this.breakPoint = "sm"; break; case width >= 768 && width < 992: this.breakPoint = "md"; break; case width >= 992 && width < 1200: this.breakPoint = "lg"; break; case width > 1200: this.breakPoint = "xl"; break; } } /** * @private * @return {?} */ _setSizes() { setTimeout((/** * @return {?} */ () => { this.sizes.width = this._getScrollElement().clientWidth; this.sizes.height = this._getScrollElement().offsetHeight; this.sizes.header_height = this._header ? this._header.nativeElement.offsetHeight : 0; /** @type {?} */ let content_padding = 0; if (this._content) { /** @type {?} */ const content_styles = window.getComputedStyle(this._content.nativeElement); /** @type {?} */ const content_padding_top = parseFloat(content_styles.getPropertyValue("padding-top")); /** @type {?} */ const content_padding_bottom = parseFloat(content_styles.getPropertyValue("padding-bottom")); content_padding = content_padding_top + content_padding_bottom; } /** @type {?} */ const offset = this.sizes.height - this.sizes.header_height; this.sizes.offset_height = offset - content_padding; this.onSizeChange.emit(this.sizes); }), 100); } /** * @private * @return {?} */ _updateData() { if (_.isUndefined(this.show_header)) { /** @type {?} */ const show_header = this.getConfig("header"); this.show_header = _.isBoolean(show_header) ? show_header : true; } if (_.isUndefined(this.show_layout_header)) { /** @type {?} */ const show_layout_header = this.getConfig("layout.header"); this.show_layout_header = _.isBoolean(show_layout_header) ? show_layout_header : true; } if (_.isUndefined(this.show_layout_sidebar)) { /** @type {?} */ const show_layout_sidebar = this.getConfig("layout.sidebar"); this.show_layout_sidebar = _.isBoolean(show_layout_sidebar) ? show_layout_sidebar : true; } this._layoutRouterService.updateTemplate(); } /** * @private * @param {?} route * @return {?} */ _getActiveRoute(route) { // Fet the child routes /** @type {?} */ const children = route.children; /** @type {?} */ let current; // Return if there are no more children if (children.length === 0) { return route; } // Iterate over each children for (const child of children) { // Verify primary route if (child.outlet !== PRIMARY_OUTLET) { continue; } // Recursive current = this._getActiveRoute(child); } return current; } } TemplateComponent.decorators = [ { type: Component, args: [{ selector: "uex-template", template: "<div class=\"uex-template-bg\" [style.background-color]=\"getConfig('background.color')\" [style.background-image]=\"getConfig('background.image')\" *ngIf=\"!show_header\"></div>\r\n\r\n<div #wrapper class=\"uex-template-wrapper\">\r\n <div #header class=\"uex-template-header\" *ngIf=\"show_header\"\r\n\r\n [class.uex-template-header-theme-default]=\"isTheme('DEFAULT')\"\r\n [class.uex-template-header-theme-dark]=\"isTheme('DARK')\"\r\n [class.uex-template-header-theme-light]=\"isTheme('LIGHT')\"\r\n [class.uex-template-header-theme-blue]=\"isTheme('BLUE')\"\r\n\r\n [class.uex-template-header-with-form-bar]=\"hasFormBar()\"\r\n [class.uex-template-header-with-breadcrumbs]=\"breadcrumb?.visible\"\r\n\r\n [style.background-color]=\"getConfig('background.color')\"\r\n [style.background-image]=\"getConfig('background.image')\">\r\n <div class=\"row m-0\" [hidden]=\"!breadcrumb?.visible\">\r\n <div class=\"uex-template-breadcrumb col-12\">\r\n <uex-breadcrumb #breadcrumb></uex-breadcrumb>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row m-0\">\r\n <div class=\"uex-template-header-side col-12\" [class.col-sm-6]=\"hasActionBar()\" *ngIf=\"title || hasActionBar()\">\r\n <div class=\"uex-template-title\" [title]=\"title ? title : ''\" *ngIf=\"title\">\r\n <h1>{{title}}</h1>\r\n </div>\r\n\r\n <div class=\"uex-template-subtitle\" [title]=\"subtitle ? subtitle : ''\" *ngIf=\"subtitle\">\r\n <h2>{{subtitle}}</h2>\r\n </div>\r\n </div>\r\n\r\n <div class=\"uex-template-header-side col-12 col-sm-6\" *ngIf=\"hasActionBar()\">\r\n <div class=\"uex-template-action-bar align-items-end text-right col-12\" [class.align-self-start]=\"actionBar.is_top\" [class.align-self-end]=\"actionBar.is_bottom\" [ngClass]=\"actionBar.cssClass\" *ngFor=\"let actionBar of actionBars\">\r\n <ng-template [uex-portal]=\"actionBar.content\"></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row m-0\">\r\n <div class=\"uex-template-header-bottom col-12 p-0\" *ngIf=\"hasFormBar()\" [hidden]=\"formBar?.hidden\">\r\n <div class=\"uex-template-form-bar\">\r\n <ng-template [uex-portal]=\"formBar?.content\"></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div #content class=\"uex-template-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n", host: { class: "uex-template", "[attr.title]": "null", "[attr.subtitle]": "null" } }] } ]; /** @nocollapse */ TemplateComponent.ctorParameters = () => [ { type: ActivatedRoute }, { type: DeviceDetectorService }, { type: ConfigService }, { type: LayoutRouterService }, { type: ElementRef } ]; TemplateComponent.propDecorators = { _actionBars: [{ type: ContentChildren, args: [ActionBarComponent, { descendants: true },] }], _formBar: [{ type: ContentChild, args: [FormBarComponent, { static: false },] }], _wrapper: [{ type: ViewChild, args: ["wrapper", { static: true },] }], _header: [{ type: ViewChild, args: ["header", { static: false },] }], _content: [{ type: ViewChild, args: ["content", { static: true },] }], title: [{ type: Input, args: ["title",] }], subtitle: [{ type: Input, args: ["subtitle",] }], type: [{ type: Input, args: ["type",] }], show_header: [{ type: Input, args: ["show-header",] }], show_layout_header: [{ type: Input, args: ["show-layout-header",] }], show_layout_sidebar: [{ type: Input, args: ["show-layout-sidebar",] }], size: [{ type: Input, args: ["size",] }], _onResize: [{ type: HostListener, args: ["window:resize",] }], _onScroll: [{ type: HostListener, args: ["scroll",] }] }; if (false) { /** * @type {?} * @private */ TemplateComponent.prototype._wrapper; /** * @type {?} * @private */ TemplateComponent.prototype._header; /** * @type {?} * @private */ TemplateComponent.prototype._content; /** @type {?} */ TemplateComponent.prototype.title; /** @type {?} */ TemplateComponent.prototype.subtitle; /** @type {?} */ TemplateComponent.prototype.type; /** @type {?} */ TemplateComponent.prototype.show_header; /** @type {?} */ TemplateComponent.prototype.show_layout_header; /** @type {?} */ TemplateComponent.prototype.show_layout_sidebar; /** @type {?} */ TemplateComponent.prototype.size; /** @type {?} */ TemplateComponent.prototype.formBar; /** @type {?} */ TemplateComponent.prototype.actionBars; /** @type {?} */ TemplateComponent.prototype.onSizeChange; /** @type {?} */ TemplateComponent.prototype.onScroll; /** @type {?} */ TemplateComponent.prototype.breakPoint; /** @type {?} */ TemplateComponent.prototype.breakPoints; /** @type {?} */ TemplateComponent.prototype.sizes; /** @type {?} */ TemplateComponent.prototype.scrollRef; /** @type {?} */ TemplateComponent.prototype.relative; /** * @type {?} * @private */ TemplateComponent.prototype._device_info; /** * @type {?} * @private */ TemplateComponent.prototype._route; /** * @type {?} * @private */ TemplateComponent.prototype._deviceService; /** * @type {?} * @private */ TemplateComponent.prototype._config; /** * @type {?} * @private */ TemplateComponent.prototype._layoutRouterService; /** @type {?} */ TemplateComponent.prototype.elementRef; } /** * @record */ export function TemplateScrollRef() { } if (false) { /** @type {?} */ TemplateScrollRef.prototype.top; /** @type {?} */ TemplateScrollRef.prototype.left; } /** * @record */ export function TemplateSizes() { } if (false) { /** @type {?} */ TemplateSizes.prototype.width; /** @type {?} */ TemplateSizes.prototype.height; /** @type {?} */ TemplateSizes.prototype.header_height; /** @type {?} */ TemplateSizes.prototype.offset_height; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVleC93ZWItZXh0ZW5zaW9ucy8iLCJzb3VyY2VzIjpbImxpYi9tb2R1bGVzL3RlbXBsYXRlL3RlbXBsYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxxQkFBcUIsRUFBYyxNQUFNLHFCQUFxQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztNQUVsRSxxQkFBcUIsR0FBRyxRQUFRO0FBV3RDLE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7O0lBVzVCLFlBQ1UsTUFBc0IsRUFDdEIsY0FBcUMsRUFDckMsT0FBc0IsRUFDdEIsb0JBQXlDLEVBQzFDLFVBQXNCO1FBSnJCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFDMUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQVNoQixTQUFJLEdBQUcsU0FBUyxDQUFDO1FBSWpCLFNBQUksR0FBaUIsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUtyRCxpQkFBWSxHQUFnQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9ELGFBQVEsR0FBb0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcvRCxnQkFBVyxHQUE4QjtZQUM5QyxJQUFJO1lBQ0osSUFBSTtZQUNKLElBQUk7WUFDSixJQUFJO1lBQ0osSUFBSTtTQUNMLENBQUM7UUFFSyxVQUFLLEdBQWtCO1lBQzVCLEtBQUssRUFBRSxDQUFDO1lBQ1IsTUFBTSxFQUFFLENBQUM7WUFDVCxhQUFhLEVBQUUsQ0FBQztZQUNoQixhQUFhLEVBQUUsQ0FBQztTQUNqQixDQUFDO1FBRUssY0FBUyxHQUFzQjtZQUNwQyxHQUFHLEVBQUUsQ0FBQztZQUNOLElBQUksRUFBRSxDQUFDO1NBQ1IsQ0FBQztRQUVLLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFaEIsaUJBQVksR0FBZSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBM0NwRSxDQUFDOzs7Ozs7SUFoQkosSUFDWSxXQUFXLENBQUMsV0FBMEM7UUFDaEUsVUFBVTs7O1FBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Ozs7OztJQUNELElBQStELFFBQVEsQ0FDckUsUUFBMEI7UUFFMUIsVUFBVTs7O1FBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7Ozs7SUFxRHFDLFNBQVM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7Ozs7SUFFOEIsU0FBUztRQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFNBQVM7WUFDdkMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFVBQVU7U0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDOzs7O0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDOzs7O0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNqRCxDQUFDOzs7O0lBRU0sZUFBZTtRQUNwQixVQUFVOzs7UUFBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTs7c0JBQ1QsSUFBSSxHQUFtQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7Z0JBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNuRCxxQkFBcUIsQ0FDdEIsQ0FBQzthQUNIO1lBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Ozs7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs7Ozs7SUFFTSxRQUFRLENBQUMsTUFBYyxFQUFFLFNBQWtCLEtBQUs7UUFDckQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUM5QixHQUFHLEVBQUUsTUFBTTtnQkFDWCxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07YUFDckMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs7Ozs7SUFFTSxjQUFjLENBQUMsTUFBYyxFQUFFLFNBQWtCLEtBQUs7UUFDM0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEIsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7YUFDdkI7O2tCQUNLLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzlELElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ1AsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLG1CQUFLLEVBQUUsRUFBQSxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQzs7Ozs7SUFFTSxXQUFXLENBQUMsU0FBa0IsS0FBSztRQUN4QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQzlCLEdBQUcsRUFBRSxDQUFDO2dCQUNOLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTTthQUNyQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Ozs7O0lBRU0sY0FBYyxDQUFDLFNBQWtCLEtBQUs7UUFDM0MsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUM5QixHQUFHLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsWUFBWTtnQkFDMUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNO2FBQ3JDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7OztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7Ozs7O0lBRU0sWUFBWSxDQUFDLElBQXdCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7SUFDakMsQ0FBQzs7Ozs7SUFFTSxlQUFlLENBQUMsSUFBd0I7UUFDN0MsT0FBTyxDQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQzFDLENBQUM7SUFDSixDQUFDOzs7OztJQUVNLGVBQWUsQ0FBQyxJQUF3QjtRQUM3QyxPQUFPLENBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDMUMsQ0FBQztJQUNKLENBQUM7Ozs7O0lBRU0sU0FBUyxDQUFDLElBQUk7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztTQUN2QjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTs7a0JBQ1YsYUFBYSxHQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU87WUFFL0IsSUFBSSxDQUFDLGFBQWE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFaEMsUUFBUSxJQUFJLEVBQUU7Z0JBQ1osS0FBSyxrQkFBa0I7b0JBQ3JCLE9BQU8sYUFBYSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3hDLEtBQUssa0JBQWtCO29CQUNyQixPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSzt3QkFDbkMsQ0FBQyxDQUFDLFFBQVEsYUFBYSxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUk7d0JBQzVDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ1g7b0JBQ0UsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNyQztTQUNGO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQzs7Ozs7SUFFTSxPQUFPLENBQUMsVUFBa0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RCxDQUFDOzs7O0lBRU0sVUFBVTtRQUNmLDRCQUE0QjtRQUM1QixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzdELENBQUM7Ozs7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQzs7OztJQUVNLFNBQVM7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7O2tCQUNYLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDOzs7a0JBRWpDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDM0MsT0FBTyxPQUFPLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUM7U0FDL0M7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7OztJQUVPLGlCQUFpQixDQUFDLFdBQW9CLEtBQUs7O2NBQzNDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxRQUFRO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUNqQyxDQUFDLENBQUMsUUFBUSxJQUFJLFNBQVM7Z0JBQ3JCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDZixDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWU7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3BDLENBQUM7Ozs7O0lBRU8sY0FBYzs7Y0FDZCxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXO1FBQ3ZDLFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxLQUFLLEdBQUcsR0FBRztnQkFDZCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRztnQkFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUixLQUFLLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUc7Z0JBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixNQUFNO1lBQ1IsS0FBSyxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJO2dCQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssS0FBSyxHQUFHLElBQUk7Z0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLE1BQU07U0FDVDtJQUNILENBQUM7Ozs7O0lBRU8sU0FBUztRQUNmLFVBQVU7OztRQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU87Z0JBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZO2dCQUN6QyxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFDRixlQUFlLEdBQUcsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7O3NCQUNYLGNBQWMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUM1Qjs7c0JBQ0ssbUJBQW1CLEdBQUcsVUFBVSxDQUNwQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQy9DOztzQkFDSyxzQkFBc0IsR0FBRyxVQUFVLENBQ3ZDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUNsRDtnQkFDRCxlQUFlLEdBQUcsbUJBQW1CLEdBQUcsc0JBQXNCLENBQUM7YUFDaEU7O2tCQUNLLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7WUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsTUFBTSxHQUFHLGVBQWUsQ0FBQztZQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQyxHQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQzs7Ozs7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7O2tCQUM3QixXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUNsRTtRQUNELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRTs7a0JBQ3BDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1lBQzFELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDO2dCQUN2RCxDQUFDLENBQUMsa0JBQWtCO2dCQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ1Y7UUFDRCxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7O2tCQUNyQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQzVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDO2dCQUN6RCxDQUFDLENBQUMsbUJBQW1CO2dCQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ1Y7UUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDN0MsQ0FBQzs7Ozs7O0lBRU8sZUFBZSxDQUFDLEtBQXFCOzs7Y0FFckMsUUFBUSxHQUFxQixLQUFLLENBQUMsUUFBUTs7WUFDN0MsT0FBdUI7UUFFM0IsdUNBQXVDO1FBQ3ZDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELDZCQUE2QjtRQUM3QixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRTtZQUM1Qix1QkFBdUI7WUFDdkIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLGNBQWMsRUFBRTtnQkFDbkMsU0FBUzthQUNWO1lBRUQsWUFBWTtZQUNaLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7O1lBaFVGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsY0FBYztnQkFDeEIsZzdFQUF3QztnQkFDeEMsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxjQUFjO29CQUNyQixjQUFjLEVBQUUsTUFBTTtvQkFDdEIsaUJBQWlCLEVBQUUsTUFBTTtpQkFDMUI7YUFDRjs7OztZQXZCUSxjQUFjO1lBR2QscUJBQXFCO1lBRXJCLGFBQWE7WUFNYixtQkFBbUI7WUFyQjFCLFVBQVU7OzswQkFtQ1QsZUFBZSxTQUFDLGtCQUFrQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTt1QkFJekQsWUFBWSxTQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTt1QkFjaEQsU0FBUyxTQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7c0JBQ3JDLFNBQVMsU0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO3VCQUNyQyxTQUFTLFNBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtvQkFFckMsS0FBSyxTQUFDLE9BQU87dUJBQ2IsS0FBSyxTQUFDLFVBQVU7bUJBQ2hCLEtBQUssU0FBQyxNQUFNOzBCQUNaLEtBQUssU0FBQyxhQUFhO2lDQUNuQixLQUFLLFNBQUMsb0JBQW9CO2tDQUMxQixLQUFLLFNBQUMscUJBQXFCO21CQUMzQixLQUFLLFNBQUMsTUFBTTt3QkFpQ1osWUFBWSxTQUFDLGVBQWU7d0JBSTVCLFlBQVksU0FBQyxRQUFROzs7Ozs7O0lBL0N0QixxQ0FBcUU7Ozs7O0lBQ3JFLG9DQUFvRTs7Ozs7SUFDcEUscUNBQXFFOztJQUVyRSxrQ0FBOEI7O0lBQzlCLHFDQUFvQzs7SUFDcEMsaUNBQWdDOztJQUNoQyx3Q0FBMkM7O0lBQzNDLCtDQUF5RDs7SUFDekQsZ0RBQTJEOztJQUMzRCxpQ0FBNEQ7O0lBRTVELG9DQUFpQzs7SUFDakMsdUNBQTZDOztJQUU3Qyx5Q0FBc0U7O0lBQ3RFLHFDQUFzRTs7SUFFdEUsdUNBQXNDOztJQUN0Qyx3Q0FNRTs7SUFFRixrQ0FLRTs7SUFFRixzQ0FHRTs7SUFFRixxQ0FBd0I7Ozs7O0lBRXhCLHlDQUF1RTs7Ozs7SUFoRHJFLG1DQUE4Qjs7Ozs7SUFDOUIsMkNBQTZDOzs7OztJQUM3QyxvQ0FBOEI7Ozs7O0lBQzlCLGlEQUFpRDs7SUFDakQsdUNBQTZCOzs7OztBQTRTakMsdUNBR0M7OztJQUZDLGdDQUFZOztJQUNaLGlDQUFhOzs7OztBQUdmLG1DQUtDOzs7SUFKQyw4QkFBYzs7SUFDZCwrQkFBZTs7SUFDZixzQ0FBc0I7O0lBQ3RCLHNDQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgQWZ0ZXJWaWV3SW5pdFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQUklNQVJZX09VVExFVCB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UsIERldmljZUluZm8gfSBmcm9tIFwibmd4LWRldmljZS1kZXRlY3RvclwiO1xyXG5cclxuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb25maWcuc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHsgQWN0aW9uQmFyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9hY3Rpb24tYmFyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBGb3JtQmFyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9mb3JtLWJhci5jb21wb25lbnRcIjtcclxuXHJcbmltcG9ydCB7IFRlbXBsYXRlU2l6ZSwgVGVtcGxhdGVUaGVtZSB9IGZyb20gXCIuL3RlbXBsYXRlLmVudW1cIjtcclxuaW1wb3J0IHsgTGF5b3V0Um91dGVyU2VydmljZSB9IGZyb20gXCIuLi9sYXlvdXQvc2VydmljZXMvcm91dGVyLnNlcnZpY2VcIjtcclxuXHJcbmNvbnN0IFJPVVRFX0RBVEFfQlJFQURDUlVNQiA9IFwiJHRpdGxlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJ1ZXgtdGVtcGxhdGVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6IFwidWV4LXRlbXBsYXRlXCIsXHJcbiAgICBcIlthdHRyLnRpdGxlXVwiOiBcIm51bGxcIixcclxuICAgIFwiW2F0dHIuc3VidGl0bGVdXCI6IFwibnVsbFwiXHJcbiAgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcclxuICBAQ29udGVudENoaWxkcmVuKEFjdGlvbkJhckNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxyXG4gIHByaXZhdGUgc2V0IF9hY3Rpb25CYXJzKGFjdGlvbl9iYXJzOiBRdWVyeUxpc3Q8QWN0aW9uQmFyQ29tcG9uZW50Pikge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5hY3Rpb25CYXJzID0gYWN0aW9uX2JhcnMudG9BcnJheSgpKSwgMCk7XHJcbiAgfVxyXG4gIEBDb250ZW50Q2hpbGQoRm9ybUJhckNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHByaXZhdGUgc2V0IF9mb3JtQmFyKFxyXG4gICAgZm9ybV9iYXI6IEZvcm1CYXJDb21wb25lbnRcclxuICApIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9ybUJhciA9IGZvcm1fYmFyKSwgMCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgX2RldmljZVNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NvbmZpZzogQ29uZmlnU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xheW91dFJvdXRlclNlcnZpY2U6IExheW91dFJvdXRlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZlxyXG4gICkge31cclxuXHJcbiAgQFZpZXdDaGlsZChcIndyYXBwZXJcIiwgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBfd3JhcHBlcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKFwiaGVhZGVyXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIF9oZWFkZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChcImNvbnRlbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBfY29udGVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KFwidGl0bGVcIikgdGl0bGU6IHN0cmluZztcclxuICBASW5wdXQoXCJzdWJ0aXRsZVwiKSBzdWJ0aXRsZTogc3RyaW5nO1xyXG4gIEBJbnB1dChcInR5cGVcIikgdHlwZSA9IFwiZGVmYXVsdFwiO1xyXG4gIEBJbnB1dChcInNob3ctaGVhZGVyXCIpIHNob3dfaGVhZGVyOiBib29sZWFuO1xyXG4gIEBJbnB1dChcInNob3ctbGF5b3V0LWhlYWRlclwiKSBzaG93X2xheW91dF9oZWFkZXI6IGJvb2xlYW47XHJcbiAgQElucHV0KFwic2hvdy1sYXlvdXQtc2lkZWJhclwiKSBzaG93X2xheW91dF9zaWRlYmFyOiBib29sZWFuO1xyXG4gIEBJbnB1dChcInNpemVcIikgc2l6ZTogVGVtcGxhdGVTaXplID0gVGVtcGxhdGVTaXplLlJFU1BPTlNJVkU7XHJcblxyXG4gIHB1YmxpYyBmb3JtQmFyOiBGb3JtQmFyQ29tcG9uZW50O1xyXG4gIHB1YmxpYyBhY3Rpb25CYXJzOiBBcnJheTxBY3Rpb25CYXJDb21wb25lbnQ+O1xyXG5cclxuICBwdWJsaWMgb25TaXplQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VGVtcGxhdGVTaXplcz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgcHVibGljIG9uU2Nyb2xsOiBFdmVudEVtaXR0ZXI8VGVtcGxhdGVTY3JvbGxSZWY+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBwdWJsaWMgYnJlYWtQb2ludDogVGVtcGxhdGVCcmVha1BvaW50O1xyXG4gIHB1YmxpYyBicmVha1BvaW50czogQXJyYXk8VGVtcGxhdGVCcmVha1BvaW50PiA9IFtcclxuICAgIFwieHNcIixcclxuICAgIFwic21cIixcclxuICAgIFwibWRcIixcclxuICAgIFwibGdcIixcclxuICAgIFwieGxcIlxyXG4gIF07XHJcblxyXG4gIHB1YmxpYyBzaXplczogVGVtcGxhdGVTaXplcyA9IHtcclxuICAgIHdpZHRoOiAwLFxyXG4gICAgaGVpZ2h0OiAwLFxyXG4gICAgaGVhZGVyX2hlaWdodDogMCxcclxuICAgIG9mZnNldF9oZWlnaHQ6IDBcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc2Nyb2xsUmVmOiBUZW1wbGF0ZVNjcm9sbFJlZiA9IHtcclxuICAgIHRvcDogMCxcclxuICAgIGxlZnQ6IDBcclxuICB9O1xyXG5cclxuICBwdWJsaWMgcmVsYXRpdmUgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfZGV2aWNlX2luZm86IERldmljZUluZm8gPSB0aGlzLl9kZXZpY2VTZXJ2aWNlLmdldERldmljZUluZm8oKTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIikgcHVibGljIF9vblJlc2l6ZSgpIHtcclxuICAgIHRoaXMucmVzaXplKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKFwic2Nyb2xsXCIpIHB1YmxpYyBfb25TY3JvbGwoKSB7XHJcbiAgICB0aGlzLnNjcm9sbFJlZiA9IHtcclxuICAgICAgdG9wOiB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuc2Nyb2xsVG9wLFxyXG4gICAgICBsZWZ0OiB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuc2Nyb2xsTGVmdFxyXG4gICAgfTtcclxuICAgIHRoaXMub25TY3JvbGwuZW1pdCh0aGlzLnNjcm9sbFJlZik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9sYXlvdXRSb3V0ZXJTZXJ2aWNlLnJlZ2lzdGVyVGVtcGxhdGUodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9sYXlvdXRSb3V0ZXJTZXJ2aWNlLnVucmVnaXN0ZXJUZW1wbGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMudGl0bGUpIHtcclxuICAgICAgICBjb25zdCByb290OiBBY3RpdmF0ZWRSb3V0ZSA9IHRoaXMuX3JvdXRlLnJvb3Q7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuX2dldEFjdGl2ZVJvdXRlKHJvb3QpLnNuYXBzaG90LmRhdGFbXHJcbiAgICAgICAgICBST1VURV9EQVRBX0JSRUFEQ1JVTUJcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZURhdGEoKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5fdXBkYXRlRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvKG9mZnNldDogbnVtYmVyLCBzbW9vdGg6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMuaGFzU2Nyb2xsKCkpIHtcclxuICAgICAgdGhpcy5fZ2V0U2Nyb2xsRWxlbWVudCgpLnNjcm9sbCh7XHJcbiAgICAgICAgdG9wOiBvZmZzZXQsXHJcbiAgICAgICAgYmVoYXZpb3I6IHNtb290aCA/IFwic21vb3RoXCIgOiBcImF1dG9cIlxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0FuY2hvcihhbmNob3I6IHN0cmluZywgc21vb3RoOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh0aGlzLmhhc1Njcm9sbCgpKSB7XHJcbiAgICAgIGlmIChhbmNob3IuaW5kZXhPZihcIiNcIikgIT09IDApIHtcclxuICAgICAgICBhbmNob3IgPSBgIyR7YW5jaG9yfWA7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGFuY2hvcik7XHJcbiAgICAgIGlmICghZWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zY3JvbGxUbygoPGFueT5lbCkub2Zmc2V0VG9wLCBzbW9vdGgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvVG9wKHNtb290aDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTY3JvbGwoKSkge1xyXG4gICAgICB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuc2Nyb2xsKHtcclxuICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgYmVoYXZpb3I6IHNtb290aCA/IFwic21vb3RoXCIgOiBcImF1dG9cIlxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0JvdHRvbShzbW9vdGg6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMuaGFzU2Nyb2xsKCkpIHtcclxuICAgICAgdGhpcy5fZ2V0U2Nyb2xsRWxlbWVudCgpLnNjcm9sbCh7XHJcbiAgICAgICAgdG9wOiB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuc2Nyb2xsSGVpZ2h0LFxyXG4gICAgICAgIGJlaGF2aW9yOiBzbW9vdGggPyBcInNtb290aFwiIDogXCJhdXRvXCJcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzaXplKCkge1xyXG4gICAgdGhpcy5fc2V0QnJlYWtQb2ludCgpO1xyXG4gICAgdGhpcy5fc2V0U2l6ZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0JyZWFrUG9pbnQoc2l6ZTogVGVtcGxhdGVCcmVha1BvaW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5icmVha1BvaW50ID09IHNpemU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNCcmVha1BvaW50TWluKHNpemU6IFRlbXBsYXRlQnJlYWtQb2ludCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5icmVha1BvaW50cy5pbmRleE9mKHNpemUpIDw9XHJcbiAgICAgIHRoaXMuYnJlYWtQb2ludHMuaW5kZXhPZih0aGlzLmJyZWFrUG9pbnQpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQnJlYWtQb2ludE1heChzaXplOiBUZW1wbGF0ZUJyZWFrUG9pbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuYnJlYWtQb2ludHMuaW5kZXhPZihzaXplKSA+PVxyXG4gICAgICB0aGlzLmJyZWFrUG9pbnRzLmluZGV4T2YodGhpcy5icmVha1BvaW50KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb25maWcocGF0aCk6IGFueSB7XHJcbiAgICBpZiAoIXRoaXMudHlwZSkge1xyXG4gICAgICB0aGlzLnR5cGUgPSBcImRlZmF1bHRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9jb25maWcpIHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVfdHlwZSA9XHJcbiAgICAgICAgdGhpcy5fY29uZmlnLnRlbXBsYXRlW3RoaXMudHlwZV0gfHxcclxuICAgICAgICB0aGlzLl9jb25maWcudGVtcGxhdGVbXCIxXCJdIHx8XHJcbiAgICAgICAgdGhpcy5fY29uZmlnLnRlbXBsYXRlLmRlZmF1bHQ7XHJcblxyXG4gICAgICBpZiAoIXRlbXBsYXRlX3R5cGUpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgc3dpdGNoIChwYXRoKSB7XHJcbiAgICAgICAgY2FzZSBcImJhY2tncm91bmQuY29sb3JcIjpcclxuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZV90eXBlLmJhY2tncm91bmQuY29sb3I7XHJcbiAgICAgICAgY2FzZSBcImJhY2tncm91bmQuaW1hZ2VcIjpcclxuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZV90eXBlLmJhY2tncm91bmQuaW1hZ2VcclxuICAgICAgICAgICAgPyBgdXJsKFwiJHt0ZW1wbGF0ZV90eXBlLmJhY2tncm91bmQuaW1hZ2V9XCIpYFxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJldHVybiBfLmdldCh0ZW1wbGF0ZV90eXBlLCBwYXRoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNUaGVtZSh0aGVtZV90eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldENvbmZpZyhcInRoZW1lXCIpID09IFRlbXBsYXRlVGhlbWVbdGhlbWVfdHlwZV07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFzRm9ybUJhcigpOiBib29sZWFuIHtcclxuICAgIC8vIHJldHVybiB0aGlzLmhhc19mb3JtX2JhcjtcclxuICAgIHJldHVybiB0aGlzLmZvcm1CYXIgJiYgdGhpcy5mb3JtQmFyLmNvbnRlbnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFzQWN0aW9uQmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uQmFycyAmJiB0aGlzLmFjdGlvbkJhcnMubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNTY3JvbGwoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fd3JhcHBlcikge1xyXG4gICAgICBjb25zdCBlbCA9IHRoaXMuX2dldFNjcm9sbEVsZW1lbnQodHJ1ZSk7XHJcbiAgICAgIC8vIGNvbnN0IHdyYXBwZXIgPSB0aGlzLl93cmFwcGVyLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlc1swXTtcclxuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuX3dyYXBwZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgcmV0dXJuIHdyYXBwZXIub2Zmc2V0SGVpZ2h0ID4gZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0U2Nyb2xsRWxlbWVudCh1c2VfYm9keTogYm9vbGVhbiA9IGZhbHNlKTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgaXNfc2FmYXJpID0gdGhpcy5fZGV2aWNlX2luZm8uYnJvd3NlciA9PSBcInNhZmFyaVwiO1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5sYXlvdXQucmVsYXRpdmVcclxuICAgICAgPyB1c2VfYm9keSB8fCBpc19zYWZhcmlcclxuICAgICAgICA/IGRvY3VtZW50LmJvZHlcclxuICAgICAgICA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxyXG4gICAgICA6IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0QnJlYWtQb2ludCgpIHtcclxuICAgIGNvbnN0IHdpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDtcclxuICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICBjYXNlIHdpZHRoIDwgNTc2OlxyXG4gICAgICAgIHRoaXMuYnJlYWtQb2ludCA9IFwieHNcIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSB3aWR0aCA+PSA1NzYgJiYgd2lkdGggPCA3Njg6XHJcbiAgICAgICAgdGhpcy5icmVha1BvaW50ID0gXCJzbVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHdpZHRoID49IDc2OCAmJiB3aWR0aCA8IDk5MjpcclxuICAgICAgICB0aGlzLmJyZWFrUG9pbnQgPSBcIm1kXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2Ugd2lkdGggPj0gOTkyICYmIHdpZHRoIDwgMTIwMDpcclxuICAgICAgICB0aGlzLmJyZWFrUG9pbnQgPSBcImxnXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2Ugd2lkdGggPiAxMjAwOlxyXG4gICAgICAgIHRoaXMuYnJlYWtQb2ludCA9IFwieGxcIjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldFNpemVzKCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2l6ZXMud2lkdGggPSB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuY2xpZW50V2lkdGg7XHJcbiAgICAgIHRoaXMuc2l6ZXMuaGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsRWxlbWVudCgpLm9mZnNldEhlaWdodDtcclxuICAgICAgdGhpcy5zaXplcy5oZWFkZXJfaGVpZ2h0ID0gdGhpcy5faGVhZGVyXHJcbiAgICAgICAgPyB0aGlzLl9oZWFkZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICA6IDA7XHJcbiAgICAgIGxldCBjb250ZW50X3BhZGRpbmcgPSAwO1xyXG4gICAgICBpZiAodGhpcy5fY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoXHJcbiAgICAgICAgICB0aGlzLl9jb250ZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfcGFkZGluZ190b3AgPSBwYXJzZUZsb2F0KFxyXG4gICAgICAgICAgY29udGVudF9zdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctdG9wXCIpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBjb250ZW50X3BhZGRpbmdfYm90dG9tID0gcGFyc2VGbG9hdChcclxuICAgICAgICAgIGNvbnRlbnRfc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nLWJvdHRvbVwiKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29udGVudF9wYWRkaW5nID0gY29udGVudF9wYWRkaW5nX3RvcCArIGNvbnRlbnRfcGFkZGluZ19ib3R0b207XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5zaXplcy5oZWlnaHQgLSB0aGlzLnNpemVzLmhlYWRlcl9oZWlnaHQ7XHJcbiAgICAgIHRoaXMuc2l6ZXMub2Zmc2V0X2hlaWdodCA9IG9mZnNldCAtIGNvbnRlbnRfcGFkZGluZztcclxuICAgICAgdGhpcy5vblNpemVDaGFuZ2UuZW1pdCh0aGlzLnNpemVzKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVEYXRhKCkge1xyXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5zaG93X2hlYWRlcikpIHtcclxuICAgICAgY29uc3Qgc2hvd19oZWFkZXIgPSB0aGlzLmdldENvbmZpZyhcImhlYWRlclwiKTtcclxuICAgICAgdGhpcy5zaG93X2hlYWRlciA9IF8uaXNCb29sZWFuKHNob3dfaGVhZGVyKSA/IHNob3dfaGVhZGVyIDogdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuc2hvd19sYXlvdXRfaGVhZGVyKSkge1xyXG4gICAgICBjb25zdCBzaG93X2xheW91dF9oZWFkZXIgPSB0aGlzLmdldENvbmZpZyhcImxheW91dC5oZWFkZXJcIik7XHJcbiAgICAgIHRoaXMuc2hvd19sYXlvdXRfaGVhZGVyID0gXy5pc0Jvb2xlYW4oc2hvd19sYXlvdXRfaGVhZGVyKVxyXG4gICAgICAgID8gc2hvd19sYXlvdXRfaGVhZGVyXHJcbiAgICAgICAgOiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5zaG93X2xheW91dF9zaWRlYmFyKSkge1xyXG4gICAgICBjb25zdCBzaG93X2xheW91dF9zaWRlYmFyID0gdGhpcy5nZXRDb25maWcoXCJsYXlvdXQuc2lkZWJhclwiKTtcclxuICAgICAgdGhpcy5zaG93X2xheW91dF9zaWRlYmFyID0gXy5pc0Jvb2xlYW4oc2hvd19sYXlvdXRfc2lkZWJhcilcclxuICAgICAgICA/IHNob3dfbGF5b3V0X3NpZGViYXJcclxuICAgICAgICA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbGF5b3V0Um91dGVyU2VydmljZS51cGRhdGVUZW1wbGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0QWN0aXZlUm91dGUocm91dGU6IEFjdGl2YXRlZFJvdXRlKTogQWN0aXZhdGVkUm91dGUge1xyXG4gICAgLy8gRmV0IHRoZSBjaGlsZCByb3V0ZXNcclxuICAgIGNvbnN0IGNoaWxkcmVuOiBBY3RpdmF0ZWRSb3V0ZVtdID0gcm91dGUuY2hpbGRyZW47XHJcbiAgICBsZXQgY3VycmVudDogQWN0aXZhdGVkUm91dGU7XHJcblxyXG4gICAgLy8gUmV0dXJuIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNoaWxkcmVuXHJcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiByb3V0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBjaGlsZHJlblxyXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICAvLyBWZXJpZnkgcHJpbWFyeSByb3V0ZVxyXG4gICAgICBpZiAoY2hpbGQub3V0bGV0ICE9PSBQUklNQVJZX09VVExFVCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSZWN1cnNpdmVcclxuICAgICAgY3VycmVudCA9IHRoaXMuX2dldEFjdGl2ZVJvdXRlKGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRlbXBsYXRlQnJlYWtQb2ludCA9IFwieHNcIiB8IFwic21cIiB8IFwibWRcIiB8IFwibGdcIiB8IFwieGxcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVTY3JvbGxSZWYge1xyXG4gIHRvcDogbnVtYmVyO1xyXG4gIGxlZnQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVNpemVzIHtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIGhlYWRlcl9oZWlnaHQ6IG51bWJlcjtcclxuICBvZmZzZXRfaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuIl19