UNPKG

angular-instantsearch

Version:

Lightning-fast search for Angular apps, by Algolia.

162 lines (158 loc) 14.1 kB
import { Component, Input, Inject, forwardRef, Optional } from '@angular/core'; import { connectPagination } from 'instantsearch.js/es/connectors'; import { TypedBaseWidget } from '../typed-base-widget'; import { NgAisInstantSearch } from '../instantsearch/instantsearch'; import { NgAisIndex } from '../index-widget/index-widget'; import { parseNumberInput, noop } from '../utils'; export class NgAisPagination extends TypedBaseWidget { constructor(parentIndex, instantSearchInstance) { super('Pagination'); this.parentIndex = parentIndex; this.instantSearchInstance = instantSearchInstance; // rendering options this.showFirst = true; this.showLast = true; this.showPrevious = true; this.showNext = true; // TODO: check if this works, padding and totalPages are most likely strings when passed to the template this.state = { createURL: () => '#', currentRefinement: 0, nbHits: 0, nbPages: 0, refine: noop, pages: [], canRefine: false, isFirstPage: false, isLastPage: false, }; } ngOnInit() { this.createWidget(connectPagination, { padding: parseNumberInput(this.padding), totalPages: parseNumberInput(this.totalPages), }, { $$widgetType: 'ais.pagination', }); super.ngOnInit(); } refine(event, page) { event.stopPropagation(); event.preventDefault(); if (page < 0 || page === this.state.currentRefinement || page >= this.state.nbPages) { return; } this.state.refine(page); } } NgAisPagination.decorators = [ { type: Component, args: [{ selector: 'ais-pagination', template: ` <div [ngClass]="[cx(), state.nbPages <= 1 ? cx('', 'noRefinement') : '']"> <ul [class]="cx('list')"> <li *ngIf="showFirst" (click)="refine($event, 0)" [class]=" cx('item') + ' ' + cx('item', 'firstPage') + (state.currentRefinement === 0 ? ' ' + cx('item', 'disabled') : '') " > <a [href]="state.createURL(0)" [class]="cx('link')" > ‹‹ </a> </li> <li *ngIf="showPrevious" (click)="refine($event, state.currentRefinement - 1)" [class]=" cx('item') + ' ' + cx('item', 'previousPage') + (state.currentRefinement === 0 ? ' ' + cx('item', 'disabled') : '') " > <a [href]="state.createURL(state.currentRefinement - 1)" [class]="cx('link')" > ‹ </a> </li> <li [class]=" cx('item') + ' ' + cx('item', 'page') + (state.currentRefinement === page ? ' ' + cx('item', 'selected') : '') " *ngFor="let page of state.pages" (click)="refine($event, page)" > <a [class]="cx('link')" [href]="state.createURL(page)" > {{page + 1}} </a> </li> <li *ngIf="showNext" (click)="refine($event, state.currentRefinement + 1)" [class]=" cx('item') + ' ' + cx('item', 'nextPage') + (state.currentRefinement + 1 === state.nbPages ? ' ' + cx('item', 'disabled') : '') " > <a [href]="state.createURL(state.currentRefinement + 1)" [class]="cx('link')" > › </a> </li> <li *ngIf="showLast" (click)="refine($event, state.nbPages - 1)" [class]=" cx('item') + ' ' + cx('item', 'lastPage') + (state.currentRefinement + 1 === state.nbPages ? ' ' + cx('item', 'disabled') : '') " > <a [href]="state.createURL(state.nbPages - 1)" [class]="cx('link')" > ›› </a> </li> </ul> </div> ` },] } ]; NgAisPagination.ctorParameters = () => [ { type: NgAisIndex, decorators: [{ type: Inject, args: [forwardRef(() => NgAisIndex),] }, { type: Optional }] }, { type: NgAisInstantSearch, decorators: [{ type: Inject, args: [forwardRef(() => NgAisInstantSearch),] }] } ]; NgAisPagination.propDecorators = { showFirst: [{ type: Input }], showLast: [{ type: Input }], showPrevious: [{ type: Input }], showNext: [{ type: Input }], padding: [{ type: Input }], totalPages: [{ type: Input }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYWdpbmF0aW9uL3BhZ2luYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFTLE1BQU0sVUFBVSxDQUFDO0FBMkd6RCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUdwQztJQXdCQyxZQUdTLFdBQXVCLEVBRXZCLHFCQUF5QztRQUVoRCxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFKYixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUV2QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQW9CO1FBNUJsRCxvQkFBb0I7UUFDSixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsaUJBQVksR0FBWSxJQUFJLENBQUM7UUFDN0IsYUFBUSxHQUFZLElBQUksQ0FBQztRQUt6Qyx3R0FBd0c7UUFFakcsVUFBSyxHQUEwQjtZQUNwQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRztZQUNwQixpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsSUFBSTtZQUNaLEtBQUssRUFBRSxFQUFFO1lBQ1QsU0FBUyxFQUFFLEtBQUs7WUFDaEIsV0FBVyxFQUFFLEtBQUs7WUFDbEIsVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQztJQVVGLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFlBQVksQ0FDZixpQkFBaUIsRUFDakI7WUFDRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN2QyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUM5QyxFQUNEO1lBQ0UsWUFBWSxFQUFFLGdCQUFnQjtTQUMvQixDQUNGLENBQUM7UUFDRixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFpQixFQUFFLElBQVk7UUFDM0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV2QixJQUNFLElBQUksR0FBRyxDQUFDO1lBQ1IsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO1lBQ3JDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFDMUI7WUFDQSxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDOzs7WUFsS0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThGVDthQUNGOzs7WUEzR1EsVUFBVSx1QkF3SWQsTUFBTSxTQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FDbkMsUUFBUTtZQTFJSixrQkFBa0IsdUJBNEl0QixNQUFNLFNBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDOzs7d0JBMUI3QyxLQUFLO3VCQUNMLEtBQUs7MkJBQ0wsS0FBSzt1QkFDTCxLQUFLO3NCQUdMLEtBQUs7eUJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEluamVjdCwgZm9yd2FyZFJlZiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbm5lY3RQYWdpbmF0aW9uIH0gZnJvbSAnaW5zdGFudHNlYXJjaC5qcy9lcy9jb25uZWN0b3JzJztcbmltcG9ydCB7IFR5cGVkQmFzZVdpZGdldCB9IGZyb20gJy4uL3R5cGVkLWJhc2Utd2lkZ2V0JztcbmltcG9ydCB7IE5nQWlzSW5zdGFudFNlYXJjaCB9IGZyb20gJy4uL2luc3RhbnRzZWFyY2gvaW5zdGFudHNlYXJjaCc7XG5pbXBvcnQgeyBOZ0Fpc0luZGV4IH0gZnJvbSAnLi4vaW5kZXgtd2lkZ2V0L2luZGV4LXdpZGdldCc7XG5pbXBvcnQgeyBwYXJzZU51bWJlcklucHV0LCBub29wLCByYW5nZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIFBhZ2luYXRpb25Db25uZWN0b3JQYXJhbXMsXG4gIFBhZ2luYXRpb25XaWRnZXREZXNjcmlwdGlvbixcbiAgUGFnaW5hdGlvblJlbmRlclN0YXRlLFxufSBmcm9tICdpbnN0YW50c2VhcmNoLmpzL2VzL2Nvbm5lY3RvcnMvcGFnaW5hdGlvbi9jb25uZWN0UGFnaW5hdGlvbic7XG5cbmV4cG9ydCB7IFBhZ2luYXRpb25Db25uZWN0b3JQYXJhbXMsIFBhZ2luYXRpb25SZW5kZXJTdGF0ZSB9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhaXMtcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbbmdDbGFzc109XCJbY3goKSwgc3RhdGUubmJQYWdlcyA8PSAxID8gY3goJycsICdub1JlZmluZW1lbnQnKSA6ICcnXVwiPlxuICAgICAgPHVsIFtjbGFzc109XCJjeCgnbGlzdCcpXCI+XG4gICAgICAgIDxsaVxuICAgICAgICAgICpuZ0lmPVwic2hvd0ZpcnN0XCJcbiAgICAgICAgICAoY2xpY2spPVwicmVmaW5lKCRldmVudCwgMClcIlxuICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgIGN4KCdpdGVtJykgK1xuICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgIGN4KCdpdGVtJywgJ2ZpcnN0UGFnZScpICtcbiAgICAgICAgICAgIChzdGF0ZS5jdXJyZW50UmVmaW5lbWVudCA9PT0gMCA/ICcgJyArIGN4KCdpdGVtJywgJ2Rpc2FibGVkJykgOiAnJylcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIFtocmVmXT1cInN0YXRlLmNyZWF0ZVVSTCgwKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY3goJ2xpbmsnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oC54oC5XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuXG4gICAgICAgIDxsaVxuICAgICAgICAgICpuZ0lmPVwic2hvd1ByZXZpb3VzXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVmaW5lKCRldmVudCwgc3RhdGUuY3VycmVudFJlZmluZW1lbnQgLSAxKVwiXG4gICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgY3goJ2l0ZW0nKSArXG4gICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgY3goJ2l0ZW0nLCAncHJldmlvdXNQYWdlJykgK1xuICAgICAgICAgICAgKHN0YXRlLmN1cnJlbnRSZWZpbmVtZW50ID09PSAwID8gJyAnICsgY3goJ2l0ZW0nLCAnZGlzYWJsZWQnKSA6ICcnKVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgW2hyZWZdPVwic3RhdGUuY3JlYXRlVVJMKHN0YXRlLmN1cnJlbnRSZWZpbmVtZW50IC0gMSlcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImN4KCdsaW5rJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKAuVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cblxuICAgICAgICA8bGlcbiAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICBjeCgnaXRlbScpICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICBjeCgnaXRlbScsICdwYWdlJykgK1xuICAgICAgICAgICAgKHN0YXRlLmN1cnJlbnRSZWZpbmVtZW50ID09PSBwYWdlID8gJyAnICsgY3goJ2l0ZW0nLCAnc2VsZWN0ZWQnKSA6ICcnKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHBhZ2Ugb2Ygc3RhdGUucGFnZXNcIlxuICAgICAgICAgIChjbGljayk9XCJyZWZpbmUoJGV2ZW50LCBwYWdlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgW2NsYXNzXT1cImN4KCdsaW5rJylcIlxuICAgICAgICAgICAgW2hyZWZdPVwic3RhdGUuY3JlYXRlVVJMKHBhZ2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7e3BhZ2UgKyAxfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG5cbiAgICAgICAgPGxpXG4gICAgICAgICAgKm5nSWY9XCJzaG93TmV4dFwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlZmluZSgkZXZlbnQsIHN0YXRlLmN1cnJlbnRSZWZpbmVtZW50ICsgMSlcIlxuICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgIGN4KCdpdGVtJykgK1xuICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgIGN4KCdpdGVtJywgJ25leHRQYWdlJykgK1xuICAgICAgICAgICAgKHN0YXRlLmN1cnJlbnRSZWZpbmVtZW50ICsgMSA9PT0gc3RhdGUubmJQYWdlcyA/ICcgJyArIGN4KCdpdGVtJywgJ2Rpc2FibGVkJykgOiAnJylcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIFtocmVmXT1cInN0YXRlLmNyZWF0ZVVSTChzdGF0ZS5jdXJyZW50UmVmaW5lbWVudCArIDEpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJjeCgnbGluaycpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDigLpcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG5cbiAgICAgICAgPGxpXG4gICAgICAgICAgKm5nSWY9XCJzaG93TGFzdFwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlZmluZSgkZXZlbnQsIHN0YXRlLm5iUGFnZXMgLSAxKVwiXG4gICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgY3goJ2l0ZW0nKSArXG4gICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgY3goJ2l0ZW0nLCAnbGFzdFBhZ2UnKSArXG4gICAgICAgICAgICAoc3RhdGUuY3VycmVudFJlZmluZW1lbnQgKyAxID09PSBzdGF0ZS5uYlBhZ2VzID8gJyAnICsgY3goJ2l0ZW0nLCAnZGlzYWJsZWQnKSA6ICcnKVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgW2hyZWZdPVwic3RhdGUuY3JlYXRlVVJMKHN0YXRlLm5iUGFnZXMgLSAxKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY3goJ2xpbmsnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oC64oC6XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgTmdBaXNQYWdpbmF0aW9uIGV4dGVuZHMgVHlwZWRCYXNlV2lkZ2V0PFxuICBQYWdpbmF0aW9uV2lkZ2V0RGVzY3JpcHRpb24sXG4gIFBhZ2luYXRpb25Db25uZWN0b3JQYXJhbXNcbj4ge1xuICAvLyByZW5kZXJpbmcgb3B0aW9uc1xuICBASW5wdXQoKSBwdWJsaWMgc2hvd0ZpcnN0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIHNob3dMYXN0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIHNob3dQcmV2aW91czogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93TmV4dDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gaW5zdGFuY2Ugb3B0aW9uc1xuICBASW5wdXQoKSBwdWJsaWMgcGFkZGluZz86IFBhZ2luYXRpb25Db25uZWN0b3JQYXJhbXNbJ3BhZGRpbmcnXTtcbiAgQElucHV0KCkgcHVibGljIHRvdGFsUGFnZXM/OiBQYWdpbmF0aW9uQ29ubmVjdG9yUGFyYW1zWyd0b3RhbFBhZ2VzJ107XG4gIC8vIFRPRE86IGNoZWNrIGlmIHRoaXMgd29ya3MsIHBhZGRpbmcgYW5kIHRvdGFsUGFnZXMgYXJlIG1vc3QgbGlrZWx5IHN0cmluZ3Mgd2hlbiBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlXG5cbiAgcHVibGljIHN0YXRlOiBQYWdpbmF0aW9uUmVuZGVyU3RhdGUgPSB7XG4gICAgY3JlYXRlVVJMOiAoKSA9PiAnIycsXG4gICAgY3VycmVudFJlZmluZW1lbnQ6IDAsXG4gICAgbmJIaXRzOiAwLFxuICAgIG5iUGFnZXM6IDAsXG4gICAgcmVmaW5lOiBub29wLFxuICAgIHBhZ2VzOiBbXSxcbiAgICBjYW5SZWZpbmU6IGZhbHNlLFxuICAgIGlzRmlyc3RQYWdlOiBmYWxzZSxcbiAgICBpc0xhc3RQYWdlOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gTmdBaXNJbmRleCkpXG4gICAgQE9wdGlvbmFsKClcbiAgICBwdWJsaWMgcGFyZW50SW5kZXg6IE5nQWlzSW5kZXgsXG4gICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE5nQWlzSW5zdGFudFNlYXJjaCkpXG4gICAgcHVibGljIGluc3RhbnRTZWFyY2hJbnN0YW5jZTogTmdBaXNJbnN0YW50U2VhcmNoXG4gICkge1xuICAgIHN1cGVyKCdQYWdpbmF0aW9uJyk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jcmVhdGVXaWRnZXQoXG4gICAgICBjb25uZWN0UGFnaW5hdGlvbixcbiAgICAgIHtcbiAgICAgICAgcGFkZGluZzogcGFyc2VOdW1iZXJJbnB1dCh0aGlzLnBhZGRpbmcpLFxuICAgICAgICB0b3RhbFBhZ2VzOiBwYXJzZU51bWJlcklucHV0KHRoaXMudG90YWxQYWdlcyksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAkJHdpZGdldFR5cGU6ICdhaXMucGFnaW5hdGlvbicsXG4gICAgICB9XG4gICAgKTtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG5cbiAgcHVibGljIHJlZmluZShldmVudDogTW91c2VFdmVudCwgcGFnZTogbnVtYmVyKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChcbiAgICAgIHBhZ2UgPCAwIHx8XG4gICAgICBwYWdlID09PSB0aGlzLnN0YXRlLmN1cnJlbnRSZWZpbmVtZW50IHx8XG4gICAgICBwYWdlID49IHRoaXMuc3RhdGUubmJQYWdlc1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUucmVmaW5lKHBhZ2UpO1xuICB9XG59XG4iXX0=