@hxui/angular
Version:
* * *
220 lines • 17 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Component, HostBinding, Input } from '@angular/core';
import { TabsetConfig } from './tabset.config';
export class TabsetComponent {
/**
* @param {?} config
*/
constructor(config) {
this.clazn = true;
this.tabs = [];
this.classMap = {};
Object.assign(this, config);
}
/**
* if true tabs will be placed vertically
* @return {?}
*/
get vertical() {
return this._vertical;
}
/**
* @param {?} value
* @return {?}
*/
set vertical(value) {
this._vertical = value;
this.setClassMap();
}
/**
* if true tabs fill the container and have a consistent width
* @return {?}
*/
get justified() {
return this._justified;
}
/**
* @param {?} value
* @return {?}
*/
set justified(value) {
this._justified = value;
this.setClassMap();
}
/**
* @return {?}
*/
get hasInfo() {
return this._hasInfo;
}
/**
* @param {?} value
* @return {?}
*/
set hasInfo(value) {
this._hasInfo = value;
this.setClassMap();
}
/**
* navigation context class: 'tabs' or 'pills'
* @return {?}
*/
get type() {
return this._type;
}
/**
* @param {?} value
* @return {?}
*/
set type(value) {
this._type = value;
this.setClassMap();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.isDestroyed = true;
}
/**
* @param {?} tab
* @return {?}
*/
addTab(tab) {
this.tabs.push(tab);
tab.active = this.tabs.length === 1 && tab.active !== false;
}
/**
* @param {?} tab
* @param {?=} options
* @return {?}
*/
removeTab(tab, options = { reselect: true, emit: true }) {
/** @type {?} */
const index = this.tabs.indexOf(tab);
if (index === -1 || this.isDestroyed) {
return;
}
// Select a new tab if the tab to be removed is selected and not destroyed
if (options.reselect && tab.active && this.hasAvailableTabs(index)) {
/** @type {?} */
const newActiveIndex = this.getClosestTabIndex(index);
this.tabs[newActiveIndex].active = true;
}
if (options.emit) {
tab.removed.emit(tab);
}
this.tabs.splice(index, 1);
if (tab.elementRef.nativeElement && tab.elementRef.nativeElement.remove) {
tab.elementRef.nativeElement.remove();
}
}
/**
* @param {?} index
* @return {?}
*/
getClosestTabIndex(index) {
/** @type {?} */
const tabsLength = this.tabs.length;
if (!tabsLength) {
return -1;
}
for (let step = 1; step <= tabsLength; step += 1) {
/** @type {?} */
const prevIndex = index - step;
/** @type {?} */
const nextIndex = index + step;
if (this.tabs[prevIndex] && !this.tabs[prevIndex].disabled) {
return prevIndex;
}
if (this.tabs[nextIndex] && !this.tabs[nextIndex].disabled) {
return nextIndex;
}
}
return -1;
}
/**
* @param {?} index
* @return {?}
*/
hasAvailableTabs(index) {
/** @type {?} */
const tabsLength = this.tabs.length;
if (!tabsLength) {
return false;
}
for (let i = 0; i < tabsLength; i += 1) {
if (!this.tabs[i].disabled && i !== index) {
return true;
}
}
return false;
}
/**
* @return {?}
*/
setClassMap() {
this.classMap = {
'is-vertical': this.vertical,
'is-justified': this.justified,
'has-info': this.hasInfo,
[`hx-nav-${this.type}`]: true
};
}
}
TabsetComponent.decorators = [
{ type: Component, args: [{
selector: 'hx-tabset',
template: `
<ul class="hx-nav" [ngClass]="classMap" (click)="$event.preventDefault()">
<li *ngFor="let tabz of tabs" [ngClass]="['hx-nav-item', tabz.customClass || '']"
[class.is-active]="tabz.active" [class.is-disabled]="tabz.disabled">
<a href="javascript:void(0);" class="hx-nav-link"
[class.is-active]="tabz.active" [class.is-disabled]="tabz.disabled"
(click)="tabz.active = true">
<span [ngTransclude]="tabz.headingRef">{{tabz.heading}}</span>
<span *ngIf="tabz.removable">
<span (click)="$event.preventDefault(); removeTab(tabz);" class="icon close-outline is-small"></span>
</span>
</a>
</li>
</ul>
<div class="hx-tab-content">
<ng-content></ng-content>
</div>
`
},] },
];
/** @nocollapse */
TabsetComponent.ctorParameters = () => [
{ type: TabsetConfig }
];
TabsetComponent.propDecorators = {
vertical: [{ type: Input }],
justified: [{ type: Input }],
hasInfo: [{ type: Input }],
type: [{ type: Input }],
clazn: [{ type: HostBinding, args: ['class.hx-tab-container',] }]
};
if (false) {
/** @type {?} */
TabsetComponent.prototype.clazn;
/** @type {?} */
TabsetComponent.prototype.tabs;
/** @type {?} */
TabsetComponent.prototype.classMap;
/** @type {?} */
TabsetComponent.prototype.isDestroyed;
/** @type {?} */
TabsetComponent.prototype._vertical;
/** @type {?} */
TabsetComponent.prototype._justified;
/** @type {?} */
TabsetComponent.prototype._hasInfo;
/** @type {?} */
TabsetComponent.prototype._type;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGFicy90YWJzZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBdUIvQyxNQUFNLE9BQU8sZUFBZTs7OztJQW1EMUIsWUFBbUIsTUFBb0I7UUFYTyxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBRXBELFNBQUksR0FBbUIsRUFBRSxDQUFDO1FBQzFCLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFTeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQzs7Ozs7SUFuREQsSUFDVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDOzs7OztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBR0QsSUFDVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOzs7OztJQUNELElBQVcsU0FBUyxDQUFDLEtBQWM7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7SUFFRCxJQUNXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBQ0QsSUFBVyxPQUFPLENBQUMsS0FBYztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0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QyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDekMsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzs7O0lBRVMsV0FBVztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQzVCLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUM5QixVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDeEIsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUk7U0FDOUIsQ0FBQztJQUNKLENBQUM7OztZQWhKRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQlQ7YUFDRjs7OztZQXRCUSxZQUFZOzs7dUJBeUJsQixLQUFLO3dCQVVMLEtBQUs7c0JBU0wsS0FBSzttQkFVTCxLQUFLO29CQVNMLFdBQVcsU0FBQyx3QkFBd0I7Ozs7SUFBckMsZ0NBQTJEOztJQUUzRCwrQkFBaUM7O0lBQ2pDLG1DQUEwQjs7SUFFMUIsc0NBQStCOztJQUMvQixvQ0FBNkI7O0lBQzdCLHFDQUE4Qjs7SUFDOUIsbUNBQTRCOztJQUM1QixnQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBUYWJEaXJlY3RpdmUgfSBmcm9tICcuL3RhYi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUYWJzZXRDb25maWcgfSBmcm9tICcuL3RhYnNldC5jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoeC10YWJzZXQnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8dWwgY2xhc3M9XCJoeC1uYXZcIiBbbmdDbGFzc109XCJjbGFzc01hcFwiIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxyXG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgdGFieiBvZiB0YWJzXCIgW25nQ2xhc3NdPVwiWydoeC1uYXYtaXRlbScsIHRhYnouY3VzdG9tQ2xhc3MgfHwgJyddXCJcclxuICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidGFiei5hY3RpdmVcIiBbY2xhc3MuaXMtZGlzYWJsZWRdPVwidGFiei5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cImh4LW5hdi1saW5rXCJcclxuICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJ0YWJ6LmFjdGl2ZVwiIFtjbGFzcy5pcy1kaXNhYmxlZF09XCJ0YWJ6LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInRhYnouYWN0aXZlID0gdHJ1ZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBbbmdUcmFuc2NsdWRlXT1cInRhYnouaGVhZGluZ1JlZlwiPnt7dGFiei5oZWFkaW5nfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFiei5yZW1vdmFibGVcIj5cclxuICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHJlbW92ZVRhYih0YWJ6KTtcIiBjbGFzcz1cImljb24gY2xvc2Utb3V0bGluZSBpcy1zbWFsbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gICAgPGRpdiBjbGFzcz1cImh4LXRhYi1jb250ZW50XCI+XHJcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvZGl2PlxyXG4gIGBcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYnNldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgLyoqIGlmIHRydWUgdGFicyB3aWxsIGJlIHBsYWNlZCB2ZXJ0aWNhbGx5ICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHZlcnRpY2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZlcnRpY2FsO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHZlcnRpY2FsKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl92ZXJ0aWNhbCA9IHZhbHVlO1xyXG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIGlmIHRydWUgdGFicyBmaWxsIHRoZSBjb250YWluZXIgYW5kIGhhdmUgYSBjb25zaXN0ZW50IHdpZHRoICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGp1c3RpZmllZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9qdXN0aWZpZWQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQganVzdGlmaWVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9qdXN0aWZpZWQgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBoYXNJbmZvKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc0luZm87XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgaGFzSW5mbyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faGFzSW5mbyA9IHZhbHVlO1xyXG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIG5hdmlnYXRpb24gY29udGV4dCBjbGFzczogJ3RhYnMnIG9yICdwaWxscycgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl90eXBlID0gdmFsdWU7XHJcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmh4LXRhYi1jb250YWluZXInKSBwdWJsaWMgY2xhem4gPSB0cnVlO1xyXG5cclxuICBwdWJsaWMgdGFiczogVGFiRGlyZWN0aXZlW10gPSBbXTtcclxuICBwdWJsaWMgY2xhc3NNYXA6IGFueSA9IHt9O1xyXG5cclxuICBwcm90ZWN0ZWQgaXNEZXN0cm95ZWQ6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF92ZXJ0aWNhbDogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgX2p1c3RpZmllZDogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgX2hhc0luZm86IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF90eXBlOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IFRhYnNldENvbmZpZykge1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkVGFiKHRhYjogVGFiRGlyZWN0aXZlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhYnMucHVzaCh0YWIpO1xyXG4gICAgdGFiLmFjdGl2ZSA9IHRoaXMudGFicy5sZW5ndGggPT09IDEgJiYgdGFiLmFjdGl2ZSAhPT0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlVGFiKHRhYjogVGFiRGlyZWN0aXZlLCBvcHRpb25zID0ge3Jlc2VsZWN0OiB0cnVlLCBlbWl0OiB0cnVlfSk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRhYnMuaW5kZXhPZih0YWIpO1xyXG4gICAgaWYgKGluZGV4ID09PSAtMSB8fCB0aGlzLmlzRGVzdHJveWVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIFNlbGVjdCBhIG5ldyB0YWIgaWYgdGhlIHRhYiB0byBiZSByZW1vdmVkIGlzIHNlbGVjdGVkIGFuZCBub3QgZGVzdHJveWVkXHJcbiAgICBpZiAob3B0aW9ucy5yZXNlbGVjdCAmJiB0YWIuYWN0aXZlICYmIHRoaXMuaGFzQXZhaWxhYmxlVGFicyhpbmRleCkpIHtcclxuICAgICAgY29uc3QgbmV3QWN0aXZlSW5kZXggPSB0aGlzLmdldENsb3Nlc3RUYWJJbmRleChpbmRleCk7XHJcbiAgICAgIHRoaXMudGFic1tuZXdBY3RpdmVJbmRleF0uYWN0aXZlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zLmVtaXQpIHtcclxuICAgICAgdGFiLnJlbW92ZWQuZW1pdCh0YWIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpZiAodGFiLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCAmJiB0YWIuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZSkge1xyXG4gICAgICB0YWIuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldENsb3Nlc3RUYWJJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHRhYnNMZW5ndGggPSB0aGlzLnRhYnMubGVuZ3RoO1xyXG4gICAgaWYgKCF0YWJzTGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBzdGVwID0gMTsgc3RlcCA8PSB0YWJzTGVuZ3RoOyBzdGVwICs9IDEpIHtcclxuICAgICAgY29uc3QgcHJldkluZGV4ID0gaW5kZXggLSBzdGVwO1xyXG4gICAgICBjb25zdCBuZXh0SW5kZXggPSBpbmRleCArIHN0ZXA7XHJcbiAgICAgIGlmICh0aGlzLnRhYnNbcHJldkluZGV4XSAmJiAhdGhpcy50YWJzW3ByZXZJbmRleF0uZGlzYWJsZWQpIHtcclxuICAgICAgICByZXR1cm4gcHJldkluZGV4O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnRhYnNbbmV4dEluZGV4XSAmJiAhdGhpcy50YWJzW25leHRJbmRleF0uZGlzYWJsZWQpIHtcclxuICAgICAgICByZXR1cm4gbmV4dEluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFzQXZhaWxhYmxlVGFicyhpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0YWJzTGVuZ3RoID0gdGhpcy50YWJzLmxlbmd0aDtcclxuICAgIGlmICghdGFic0xlbmd0aCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJzTGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgaWYgKCF0aGlzLnRhYnNbaV0uZGlzYWJsZWQgJiYgaSAhPT0gaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHNldENsYXNzTWFwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGFzc01hcCA9IHtcclxuICAgICAgJ2lzLXZlcnRpY2FsJzogdGhpcy52ZXJ0aWNhbCxcclxuICAgICAgJ2lzLWp1c3RpZmllZCc6IHRoaXMuanVzdGlmaWVkLFxyXG4gICAgICAnaGFzLWluZm8nOiB0aGlzLmhhc0luZm8sXHJcbiAgICAgIFtgaHgtbmF2LSR7dGhpcy50eXBlfWBdOiB0cnVlXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=