ngx-ui-hero
Version:
Simple, fast and reliable utilities for Angular.
106 lines • 31.8 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { TreeViewService } from '../tree-view.service';
import * as i0 from "@angular/core";
import * as i1 from "../tree-view.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "../../input-forms/components/input-text/input-text.component";
import * as i5 from "../../input-forms/components/input-currency/input-currency.component";
import * as i6 from "../../input-forms/components/input-percent/input-percent.component";
import * as i7 from "../../input-forms/components/input-number/input-number.component";
import * as i8 from "../../input-forms/components/input-date/input-date.component";
export class TreeViewItemComponent {
constructor(service) {
this.service = service;
this.showIcons = true;
this.enableLabelLinkStyle = false;
this.openned = false;
this.expandedOnInit = false;
this.rootItem = false;
this.OnItemExpanded = new EventEmitter();
this.OnItemClicked = new EventEmitter();
}
ngOnInit() {
this.handleSelecionChanges();
this.equalHeightStyle = this.columns != undefined && this.columns.length > 0;
this.summarizedStyle = this.columns != undefined
&& this.columns.length > 0
&& this.row[this.collectionProperty]
&& this.row[this.collectionProperty].length > 0;
if (this.expandedOnInit) {
this.openned = true;
}
}
Toogle() {
this.openned = !this.openned;
if (this.openned) {
this.emitItemExpandedEvent(this.row);
}
}
OnClick() {
this.emitItemClickedEvent(this.row);
}
HandleSubItemExpanded(data) {
this.emitItemExpandedEvent(data);
}
HandleSubItemClicked(data) {
this.emitItemClickedEvent(data);
}
HandleColumnClick(column, row, currentData, rowIndex) {
if (column.onClick) {
column.onClick(row, currentData, rowIndex);
}
}
emitItemExpandedEvent(data) {
this.OnItemExpanded.emit(data);
}
emitItemClickedEvent(data) {
this.OnItemClicked.emit(data);
}
handleSelecionChanges() {
this.service.onSelecionChanged.subscribe(data => {
this.active = this.idProperty && this.row[this.idProperty] == data[this.idProperty];
});
}
}
TreeViewItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewItemComponent, deps: [{ token: i1.TreeViewService }], target: i0.ɵɵFactoryTarget.Component });
TreeViewItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TreeViewItemComponent, selector: "[ui-tree-view-item]", inputs: { row: "row", idProperty: "idProperty", labelProperty: "labelProperty", collectionProperty: "collectionProperty", columns: "columns", showIcons: "showIcons", enableLabelLinkStyle: "enableLabelLinkStyle", normalItemIconClass: "normalItemIconClass", collapsableClosedItemIconClass: "collapsableClosedItemIconClass", collapsableOpennedItemIconClass: "collapsableOpennedItemIconClass", first: "first", last: "last", openned: "openned", expandedOnInit: "expandedOnInit", rootItem: "rootItem" }, outputs: { OnItemExpanded: "OnItemExpanded", OnItemClicked: "OnItemClicked" }, ngImport: i0, template: "<div class=\"item\" [ngClass]=\"{\n 'has-children': row[collectionProperty]?.length > 0,\n 'has-many-children': row[collectionProperty]?.length > 1,\n 'has-no-columns': !columns || columns.length == 0,\n 'has-no-icons': !showIcons,\n 'labels-as-link': enableLabelLinkStyle,\n 'active': active,\n 'first': first,\n 'last': last\n }\">\n <div class=\"d-flex align-items-center justify-content-between w-100\" \n [ngClass]=\"{\n 'summarized-style': summarizedStyle, \n 'equal-height': equalHeightStyle,\n 'open': openned\n }\">\n <i class=\"mx-1 fa empty\" *ngIf=\"!row[collectionProperty] || row[collectionProperty].length == 0\"></i>\n <i class=\"mx-1 fa toogler\" [ngClass]=\"{\n 'fa-plus-square-o': row[collectionProperty]?.length > 0 && !openned,\n 'fa-minus-square-o': row[collectionProperty]?.length > 0 && openned\n }\" (click)=\"Toogle()\"></i>\n <i class=\"mx-1 folder-item fa {{collapsableClosedItemIconClass}}\" *ngIf=\"row[collectionProperty]?.length > 0 && !openned && showIcons\"></i>\n <i class=\"mx-1 folder-item fa {{collapsableOpennedItemIconClass}}\" *ngIf=\"row[collectionProperty]?.length > 0 && openned && showIcons\"></i>\n <i class=\"mx-1 normal-item fa {{normalItemIconClass}}\" *ngIf=\"(!row[collectionProperty] || row[collectionProperty].length == 0) && showIcons\"></i>\n \n <label class=\"mb-0 mr-auto d-inline-block text-truncate\" (click)=\"OnClick()\">{{row[labelProperty]}}</label>\n \n <div class=\"columns d-flex align-items-center justify-content-between h-100\" *ngIf=\"columns?.length > 0\">\n <div class=\"column {{column.dataClasses}}\" \n *ngFor=\"let column of columns; let i = index;\" \n [ngStyle]=\"{'width': column.width}\"\n [ngClass]=\"{'text-center': column.dataAlignment == 1, 'text-right': column.dataAlignment == 2}\">\n \n <div *ngIf=\"!column.editable || row[collectionProperty]?.length > 0\" (click)=\"HandleColumnClick(column, row, row[column.data], i)\"> \n <div *ngIf=\"!column.render && column.data\">\n <span *ngIf=\"!column.dataType || column.dataType == 0\">{{row[column.data]}}</span>\n <span *ngIf=\"column.dataType == 1\">{{row[column.data] | date:'short'}}</span>\n <span *ngIf=\"column.dataType >= 2\">{{row[column.data] | number:'1.2-2'}}</span>\n </div>\n <span *ngIf=\"column.render\" [innerHtml]=\"column.render(row, row[column.data], i)\"></span>\n </div>\n \n <div *ngIf=\"column.editable && (!row[collectionProperty] || row[collectionProperty].length == 0)\">\n <input-text *ngIf=\"!column.dataType || column.dataType == 0\" [(ngModel)]=\"row[column.data]\"></input-text>\n <input-date *ngIf=\"column.dataType == 1\" [(ngModel)]=\"row[column.data]\"></input-date>\n <input-number *ngIf=\"column.dataType == 2\" [(ngModel)]=\"row[column.data]\"></input-number>\n <input-currency *ngIf=\"column.dataType == 3\" [(ngModel)]=\"row[column.data]\"></input-currency>\n <input-percent *ngIf=\"column.dataType == 4\" [(ngModel)]=\"row[column.data]\"></input-percent>\n </div>\n </div>\n </div>\n </div>\n \n <ul class=\"fadeInDown\" *ngIf=\"row[collectionProperty]?.length > 0 && openned\">\n <li *ngFor=\"let subitem of row[collectionProperty]; let first = first; let last = last;\" \n ui-tree-view-item\n [row]=\"subitem\"\n [columns]=\"columns\"\n [idProperty]=\"idProperty\"\n [labelProperty]=\"labelProperty\"\n [collectionProperty]=\"collectionProperty\"\n [showIcons]=\"showIcons\"\n [enableLabelLinkStyle]=\"enableLabelLinkStyle\"\n [normalItemIconClass]=\"normalItemIconClass\"\n [collapsableClosedItemIconClass]=\"collapsableClosedItemIconClass\"\n [collapsableOpennedItemIconClass]=\"collapsableOpennedItemIconClass\"\n [first]=\"first\"\n [last]=\"last\"\n [expandedOnInit]=\"expandedOnInit\"\n [showIcons]=\"showIcons\"\n (OnItemExpanded)=\"HandleSubItemExpanded($event)\"\n (OnItemClicked)=\"HandleSubItemClicked($event)\"\n >\n </li>\n </ul>\n</div>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-10%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}i.folder-item{color:#ffb822}i.normal-item{color:#c1bfd0}i.fa.fa-plus-square-o,i.fa.fa-minus-square-o{background-color:#f0f0f0;z-index:11}i.fa.empty{width:7px}.item.has-no-columns i.fa.fa-plus-square-o,.item.has-no-columns i.fa.fa-minus-square-o{background-color:#fff}.toogler,.item.labels-as-link>div>label{cursor:pointer}.item>div>label{padding:0 4px}.item.active>div>label,.item.labels-as-link>div>label:hover{background-color:#666;color:#fff;border-radius:4px}.item.active>div>label{background-color:#09498e!important}.no-selection::selection{background:transparent}ul{position:relative;padding:0;margin:0 0 0 20px}ul li{position:relative;list-style:none!important}.columns .column{margin-left:5px}.item{position:relative;overflow:hidden}.item>div{position:relative;height:30px}.item>div.equal-height{height:45px}.item>div.summarized-style{background-color:#f0f0f0;border-bottom:1px solid #CCC}.item>div.summarized-style .columns .column{padding:0 13px}.item>div:before{content:\"\";position:absolute;top:0;bottom:0;left:9px;z-index:10;width:0;border-right:1px solid #CCC}.item.has-children.first>div:before{top:0}.item.last>div:before{bottom:22px}.item.has-children.last>div:before{bottom:17px}ul:before{content:\"\";position:absolute;top:0;bottom:0;left:-11px;z-index:10;width:0;border-right:1px solid #CCC}.item.has-children.last>ul:before{display:none}.item>div:after{content:\"\";position:absolute;top:calc(50% - 1px);left:9px;z-index:10;width:13px;border-bottom:1px solid #CCC}.item.has-no-columns.last>div:before{bottom:15px}.item.has-no-icons>div>label{margin-left:5px}.item.has-no-icons.has-children>div>label{margin-left:8px}@media (max-width: 860px){.columns{display:none!important}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.InputTextComponent, selector: "input-text", inputs: ["placeholder", "inputGroupPrepend", "inputGroupAppend", "maxlength"] }, { kind: "component", type: i5.InputCurrencyComponent, selector: "input-currency", inputs: ["showInputGroup", "placeholder", "precision"] }, { kind: "component", type: i6.InputPercentComponent, selector: "input-percent", inputs: ["showInputGroup", "inputGroupText", "placeholder", "precision"] }, { kind: "component", type: i7.InputNumberComponent, selector: "input-number", inputs: ["maxValue", "minValue"] }, { kind: "component", type: i8.InputDateComponent, selector: "input-date", inputs: ["placeholder", "minDate", "maxDate", "format", "showInputGroup", "inputGroupText", "placement", "theme"], outputs: ["onChange"] }, { kind: "component", type: TreeViewItemComponent, selector: "[ui-tree-view-item]", inputs: ["row", "idProperty", "labelProperty", "collectionProperty", "columns", "showIcons", "enableLabelLinkStyle", "normalItemIconClass", "collapsableClosedItemIconClass", "collapsableOpennedItemIconClass", "first", "last", "openned", "expandedOnInit", "rootItem"], outputs: ["OnItemExpanded", "OnItemClicked"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewItemComponent, decorators: [{
type: Component,
args: [{ selector: '[ui-tree-view-item]', template: "<div class=\"item\" [ngClass]=\"{\n 'has-children': row[collectionProperty]?.length > 0,\n 'has-many-children': row[collectionProperty]?.length > 1,\n 'has-no-columns': !columns || columns.length == 0,\n 'has-no-icons': !showIcons,\n 'labels-as-link': enableLabelLinkStyle,\n 'active': active,\n 'first': first,\n 'last': last\n }\">\n <div class=\"d-flex align-items-center justify-content-between w-100\" \n [ngClass]=\"{\n 'summarized-style': summarizedStyle, \n 'equal-height': equalHeightStyle,\n 'open': openned\n }\">\n <i class=\"mx-1 fa empty\" *ngIf=\"!row[collectionProperty] || row[collectionProperty].length == 0\"></i>\n <i class=\"mx-1 fa toogler\" [ngClass]=\"{\n 'fa-plus-square-o': row[collectionProperty]?.length > 0 && !openned,\n 'fa-minus-square-o': row[collectionProperty]?.length > 0 && openned\n }\" (click)=\"Toogle()\"></i>\n <i class=\"mx-1 folder-item fa {{collapsableClosedItemIconClass}}\" *ngIf=\"row[collectionProperty]?.length > 0 && !openned && showIcons\"></i>\n <i class=\"mx-1 folder-item fa {{collapsableOpennedItemIconClass}}\" *ngIf=\"row[collectionProperty]?.length > 0 && openned && showIcons\"></i>\n <i class=\"mx-1 normal-item fa {{normalItemIconClass}}\" *ngIf=\"(!row[collectionProperty] || row[collectionProperty].length == 0) && showIcons\"></i>\n \n <label class=\"mb-0 mr-auto d-inline-block text-truncate\" (click)=\"OnClick()\">{{row[labelProperty]}}</label>\n \n <div class=\"columns d-flex align-items-center justify-content-between h-100\" *ngIf=\"columns?.length > 0\">\n <div class=\"column {{column.dataClasses}}\" \n *ngFor=\"let column of columns; let i = index;\" \n [ngStyle]=\"{'width': column.width}\"\n [ngClass]=\"{'text-center': column.dataAlignment == 1, 'text-right': column.dataAlignment == 2}\">\n \n <div *ngIf=\"!column.editable || row[collectionProperty]?.length > 0\" (click)=\"HandleColumnClick(column, row, row[column.data], i)\"> \n <div *ngIf=\"!column.render && column.data\">\n <span *ngIf=\"!column.dataType || column.dataType == 0\">{{row[column.data]}}</span>\n <span *ngIf=\"column.dataType == 1\">{{row[column.data] | date:'short'}}</span>\n <span *ngIf=\"column.dataType >= 2\">{{row[column.data] | number:'1.2-2'}}</span>\n </div>\n <span *ngIf=\"column.render\" [innerHtml]=\"column.render(row, row[column.data], i)\"></span>\n </div>\n \n <div *ngIf=\"column.editable && (!row[collectionProperty] || row[collectionProperty].length == 0)\">\n <input-text *ngIf=\"!column.dataType || column.dataType == 0\" [(ngModel)]=\"row[column.data]\"></input-text>\n <input-date *ngIf=\"column.dataType == 1\" [(ngModel)]=\"row[column.data]\"></input-date>\n <input-number *ngIf=\"column.dataType == 2\" [(ngModel)]=\"row[column.data]\"></input-number>\n <input-currency *ngIf=\"column.dataType == 3\" [(ngModel)]=\"row[column.data]\"></input-currency>\n <input-percent *ngIf=\"column.dataType == 4\" [(ngModel)]=\"row[column.data]\"></input-percent>\n </div>\n </div>\n </div>\n </div>\n \n <ul class=\"fadeInDown\" *ngIf=\"row[collectionProperty]?.length > 0 && openned\">\n <li *ngFor=\"let subitem of row[collectionProperty]; let first = first; let last = last;\" \n ui-tree-view-item\n [row]=\"subitem\"\n [columns]=\"columns\"\n [idProperty]=\"idProperty\"\n [labelProperty]=\"labelProperty\"\n [collectionProperty]=\"collectionProperty\"\n [showIcons]=\"showIcons\"\n [enableLabelLinkStyle]=\"enableLabelLinkStyle\"\n [normalItemIconClass]=\"normalItemIconClass\"\n [collapsableClosedItemIconClass]=\"collapsableClosedItemIconClass\"\n [collapsableOpennedItemIconClass]=\"collapsableOpennedItemIconClass\"\n [first]=\"first\"\n [last]=\"last\"\n [expandedOnInit]=\"expandedOnInit\"\n [showIcons]=\"showIcons\"\n (OnItemExpanded)=\"HandleSubItemExpanded($event)\"\n (OnItemClicked)=\"HandleSubItemClicked($event)\"\n >\n </li>\n </ul>\n</div>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-10%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}i.folder-item{color:#ffb822}i.normal-item{color:#c1bfd0}i.fa.fa-plus-square-o,i.fa.fa-minus-square-o{background-color:#f0f0f0;z-index:11}i.fa.empty{width:7px}.item.has-no-columns i.fa.fa-plus-square-o,.item.has-no-columns i.fa.fa-minus-square-o{background-color:#fff}.toogler,.item.labels-as-link>div>label{cursor:pointer}.item>div>label{padding:0 4px}.item.active>div>label,.item.labels-as-link>div>label:hover{background-color:#666;color:#fff;border-radius:4px}.item.active>div>label{background-color:#09498e!important}.no-selection::selection{background:transparent}ul{position:relative;padding:0;margin:0 0 0 20px}ul li{position:relative;list-style:none!important}.columns .column{margin-left:5px}.item{position:relative;overflow:hidden}.item>div{position:relative;height:30px}.item>div.equal-height{height:45px}.item>div.summarized-style{background-color:#f0f0f0;border-bottom:1px solid #CCC}.item>div.summarized-style .columns .column{padding:0 13px}.item>div:before{content:\"\";position:absolute;top:0;bottom:0;left:9px;z-index:10;width:0;border-right:1px solid #CCC}.item.has-children.first>div:before{top:0}.item.last>div:before{bottom:22px}.item.has-children.last>div:before{bottom:17px}ul:before{content:\"\";position:absolute;top:0;bottom:0;left:-11px;z-index:10;width:0;border-right:1px solid #CCC}.item.has-children.last>ul:before{display:none}.item>div:after{content:\"\";position:absolute;top:calc(50% - 1px);left:9px;z-index:10;width:13px;border-bottom:1px solid #CCC}.item.has-no-columns.last>div:before{bottom:15px}.item.has-no-icons>div>label{margin-left:5px}.item.has-no-icons.has-children>div>label{margin-left:8px}@media (max-width: 860px){.columns{display:none!important}}\n"] }]
}], ctorParameters: function () { return [{ type: i1.TreeViewService }]; }, propDecorators: { row: [{
type: Input
}], idProperty: [{
type: Input
}], labelProperty: [{
type: Input
}], collectionProperty: [{
type: Input
}], columns: [{
type: Input
}], showIcons: [{
type: Input
}], enableLabelLinkStyle: [{
type: Input
}], normalItemIconClass: [{
type: Input
}], collapsableClosedItemIconClass: [{
type: Input
}], collapsableOpennedItemIconClass: [{
type: Input
}], first: [{
type: Input
}], last: [{
type: Input
}], openned: [{
type: Input
}], expandedOnInit: [{
type: Input
}], rootItem: [{
type: Input
}], OnItemExpanded: [{
type: Output
}], OnItemClicked: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXVpLWhlcm8vc3JjL2xpYi90cmVlLXZpZXcvdHJlZS12aWV3LWl0ZW0vdHJlZS12aWV3LWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXVpLWhlcm8vc3JjL2xpYi90cmVlLXZpZXcvdHJlZS12aWV3LWl0ZW0vdHJlZS12aWV3LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFPdkQsTUFBTSxPQUFPLHFCQUFxQjtJQXVCaEMsWUFBb0IsT0FBd0I7UUFBeEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFqQm5DLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFDMUIseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBTXRDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUN6QixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBTUYsQ0FBQztJQUVqRCxRQUFRO1FBQ04sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksU0FBUztlQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO2VBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2VBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVsRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUNELE9BQU87UUFDTCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFTO1FBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0Qsb0JBQW9CLENBQUMsSUFBUztRQUM1QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQTJCLEVBQUUsR0FBUSxFQUFFLFdBQWdCLEVBQUUsUUFBZ0I7UUFDekYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUFTO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDTyxvQkFBb0IsQ0FBQyxJQUFTO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzttSEExRVUscUJBQXFCO3VHQUFyQixxQkFBcUIsNG5CQ1ZsQyxzbUlBNEVBLDQzR0RsRWEscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UscUJBQXFCO3NHQUt0QixHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFDRywrQkFBK0I7c0JBQXZDLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVHJlZVZpZXdDb2x1bW5Nb2RlbCB9IGZyb20gJy4uL21vZGVscy90cmVlLXZpZXctY29sdW1uLm1vZGVsJztcbmltcG9ydCB7IFRyZWVWaWV3U2VydmljZSB9IGZyb20gJy4uL3RyZWUtdmlldy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW3VpLXRyZWUtdmlldy1pdGVtXScsXG4gIHRlbXBsYXRlVXJsOiAnLi90cmVlLXZpZXctaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWyd0cmVlLXZpZXctaXRlbS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVWaWV3SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHJvdzogYW55O1xuICBASW5wdXQoKSBpZFByb3BlcnR5OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxhYmVsUHJvcGVydHk6IHN0cmluZztcbiAgQElucHV0KCkgY29sbGVjdGlvblByb3BlcnR5OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbHVtbnM6IEFycmF5PFRyZWVWaWV3Q29sdW1uTW9kZWw+O1xuICBASW5wdXQoKSBzaG93SWNvbnM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBlbmFibGVMYWJlbExpbmtTdHlsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBub3JtYWxJdGVtSWNvbkNsYXNzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbGxhcHNhYmxlQ2xvc2VkSXRlbUljb25DbGFzczogc3RyaW5nO1xuICBASW5wdXQoKSBjb2xsYXBzYWJsZU9wZW5uZWRJdGVtSWNvbkNsYXNzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZpcnN0OiBib29sZWFuO1xuICBASW5wdXQoKSBsYXN0OiBib29sZWFuO1xuICBASW5wdXQoKSBvcGVubmVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGV4cGFuZGVkT25Jbml0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJvb3RJdGVtOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBPbkl0ZW1FeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgT25JdGVtQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGFjdGl2ZTogYm9vbGVhbjtcbiAgc3VtbWFyaXplZFN0eWxlOiBib29sZWFuO1xuICBlcXVhbEhlaWdodFN0eWxlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogVHJlZVZpZXdTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmhhbmRsZVNlbGVjaW9uQ2hhbmdlcygpO1xuXG4gICAgdGhpcy5lcXVhbEhlaWdodFN0eWxlID0gdGhpcy5jb2x1bW5zICE9IHVuZGVmaW5lZCAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMDtcblxuICAgIHRoaXMuc3VtbWFyaXplZFN0eWxlID0gdGhpcy5jb2x1bW5zICE9IHVuZGVmaW5lZCBcbiAgICAgICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwIFxuICAgICAgJiYgdGhpcy5yb3dbdGhpcy5jb2xsZWN0aW9uUHJvcGVydHldIFxuICAgICAgJiYgdGhpcy5yb3dbdGhpcy5jb2xsZWN0aW9uUHJvcGVydHldLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAodGhpcy5leHBhbmRlZE9uSW5pdCkge1xuICAgICAgdGhpcy5vcGVubmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBUb29nbGUoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVubmVkID0gIXRoaXMub3Blbm5lZDtcbiAgICBcbiAgICBpZiAodGhpcy5vcGVubmVkKSB7XG4gICAgICB0aGlzLmVtaXRJdGVtRXhwYW5kZWRFdmVudCh0aGlzLnJvdyk7XG4gICAgfVxuICB9XG4gIE9uQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0SXRlbUNsaWNrZWRFdmVudCh0aGlzLnJvdyk7ICAgIFxuICB9XG5cbiAgSGFuZGxlU3ViSXRlbUV4cGFuZGVkKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZW1pdEl0ZW1FeHBhbmRlZEV2ZW50KGRhdGEpO1xuICB9XG4gIEhhbmRsZVN1Ykl0ZW1DbGlja2VkKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZW1pdEl0ZW1DbGlja2VkRXZlbnQoZGF0YSk7XG4gIH1cblxuICBIYW5kbGVDb2x1bW5DbGljayhjb2x1bW46IFRyZWVWaWV3Q29sdW1uTW9kZWwsIHJvdzogYW55LCBjdXJyZW50RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGNvbHVtbi5vbkNsaWNrKSB7XG4gICAgICBjb2x1bW4ub25DbGljayhyb3csIGN1cnJlbnREYXRhLCByb3dJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SXRlbUV4cGFuZGVkRXZlbnQoZGF0YTogYW55KTogdm9pZCB7XG4gICAgICB0aGlzLk9uSXRlbUV4cGFuZGVkLmVtaXQoZGF0YSk7XG4gIH1cbiAgcHJpdmF0ZSBlbWl0SXRlbUNsaWNrZWRFdmVudChkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICAgIHRoaXMuT25JdGVtQ2xpY2tlZC5lbWl0KGRhdGEpO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlU2VsZWNpb25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5vblNlbGVjaW9uQ2hhbmdlZC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZSA9IHRoaXMuaWRQcm9wZXJ0eSAmJiB0aGlzLnJvd1t0aGlzLmlkUHJvcGVydHldID09IGRhdGFbdGhpcy5pZFByb3BlcnR5XTtcbiAgICB9KTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiaXRlbVwiIFtuZ0NsYXNzXT1cIntcbiAgICAnaGFzLWNoaWxkcmVuJzogcm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0/Lmxlbmd0aCA+IDAsXG4gICAgJ2hhcy1tYW55LWNoaWxkcmVuJzogcm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0/Lmxlbmd0aCA+IDEsXG4gICAgJ2hhcy1uby1jb2x1bW5zJzogIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT0gMCxcbiAgICAnaGFzLW5vLWljb25zJzogIXNob3dJY29ucyxcbiAgICAnbGFiZWxzLWFzLWxpbmsnOiBlbmFibGVMYWJlbExpbmtTdHlsZSxcbiAgICAnYWN0aXZlJzogYWN0aXZlLFxuICAgICdmaXJzdCc6IGZpcnN0LFxuICAgICdsYXN0JzogbGFzdFxuICB9XCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctMTAwXCIgXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ3N1bW1hcml6ZWQtc3R5bGUnOiBzdW1tYXJpemVkU3R5bGUsIFxuICAgICAgJ2VxdWFsLWhlaWdodCc6IGVxdWFsSGVpZ2h0U3R5bGUsXG4gICAgICAnb3Blbic6IG9wZW5uZWRcbiAgICB9XCI+XG4gICAgPGkgY2xhc3M9XCJteC0xIGZhIGVtcHR5XCIgKm5nSWY9XCIhcm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0gfHwgcm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0ubGVuZ3RoID09IDBcIj48L2k+XG4gICAgPGkgY2xhc3M9XCJteC0xIGZhIHRvb2dsZXJcIiBbbmdDbGFzc109XCJ7XG4gICAgICAnZmEtcGx1cy1zcXVhcmUtbyc6IHJvd1tjb2xsZWN0aW9uUHJvcGVydHldPy5sZW5ndGggPiAwICYmICFvcGVubmVkLFxuICAgICAgJ2ZhLW1pbnVzLXNxdWFyZS1vJzogcm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0/Lmxlbmd0aCA+IDAgJiYgb3Blbm5lZFxuICAgIH1cIiAoY2xpY2spPVwiVG9vZ2xlKClcIj48L2k+XG4gICAgPGkgY2xhc3M9XCJteC0xIGZvbGRlci1pdGVtIGZhIHt7Y29sbGFwc2FibGVDbG9zZWRJdGVtSWNvbkNsYXNzfX1cIiAqbmdJZj1cInJvd1tjb2xsZWN0aW9uUHJvcGVydHldPy5sZW5ndGggPiAwICYmICFvcGVubmVkICYmIHNob3dJY29uc1wiPjwvaT5cbiAgICA8aSBjbGFzcz1cIm14LTEgZm9sZGVyLWl0ZW0gZmEge3tjb2xsYXBzYWJsZU9wZW5uZWRJdGVtSWNvbkNsYXNzfX1cIiAqbmdJZj1cInJvd1tjb2xsZWN0aW9uUHJvcGVydHldPy5sZW5ndGggPiAwICYmIG9wZW5uZWQgJiYgc2hvd0ljb25zXCI+PC9pPlxuICAgIDxpIGNsYXNzPVwibXgtMSBub3JtYWwtaXRlbSBmYSB7e25vcm1hbEl0ZW1JY29uQ2xhc3N9fVwiICpuZ0lmPVwiKCFyb3dbY29sbGVjdGlvblByb3BlcnR5XSB8fCByb3dbY29sbGVjdGlvblByb3BlcnR5XS5sZW5ndGggPT0gMCkgJiYgc2hvd0ljb25zXCI+PC9pPlxuICBcbiAgICA8bGFiZWwgY2xhc3M9XCJtYi0wIG1yLWF1dG8gZC1pbmxpbmUtYmxvY2sgdGV4dC10cnVuY2F0ZVwiIChjbGljayk9XCJPbkNsaWNrKClcIj57e3Jvd1tsYWJlbFByb3BlcnR5XX19PC9sYWJlbD5cbiAgXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBoLTEwMFwiICpuZ0lmPVwiY29sdW1ucz8ubGVuZ3RoID4gMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiB7e2NvbHVtbi5kYXRhQ2xhc3Nlc319XCIgXG4gICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleDtcIiBcbiAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGNvbHVtbi53aWR0aH1cIlxuICAgICAgICBbbmdDbGFzc109XCJ7J3RleHQtY2VudGVyJzogY29sdW1uLmRhdGFBbGlnbm1lbnQgPT0gMSwgJ3RleHQtcmlnaHQnOiBjb2x1bW4uZGF0YUFsaWdubWVudCA9PSAyfVwiPlxuICBcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uZWRpdGFibGUgfHwgcm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0/Lmxlbmd0aCA+IDBcIiAoY2xpY2spPVwiSGFuZGxlQ29sdW1uQ2xpY2soY29sdW1uLCByb3csIHJvd1tjb2x1bW4uZGF0YV0sIGkpXCI+ICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLnJlbmRlciAmJiBjb2x1bW4uZGF0YVwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY29sdW1uLmRhdGFUeXBlIHx8IGNvbHVtbi5kYXRhVHlwZSA9PSAwXCI+e3tyb3dbY29sdW1uLmRhdGFdfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbHVtbi5kYXRhVHlwZSA9PSAxXCI+e3tyb3dbY29sdW1uLmRhdGFdIHwgZGF0ZTonc2hvcnQnfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbHVtbi5kYXRhVHlwZSA+PSAyXCI+e3tyb3dbY29sdW1uLmRhdGFdIHwgbnVtYmVyOicxLjItMid9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbHVtbi5yZW5kZXJcIiBbaW5uZXJIdG1sXT1cImNvbHVtbi5yZW5kZXIocm93LCByb3dbY29sdW1uLmRhdGFdLCBpKVwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLmVkaXRhYmxlICYmICghcm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0gfHwgcm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0ubGVuZ3RoID09IDApXCI+XG4gICAgICAgICAgPGlucHV0LXRleHQgKm5nSWY9XCIhY29sdW1uLmRhdGFUeXBlIHx8IGNvbHVtbi5kYXRhVHlwZSA9PSAwXCIgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmRhdGFdXCI+PC9pbnB1dC10ZXh0PlxuICAgICAgICAgIDxpbnB1dC1kYXRlICpuZ0lmPVwiY29sdW1uLmRhdGFUeXBlID09IDFcIiBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uZGF0YV1cIj48L2lucHV0LWRhdGU+XG4gICAgICAgICAgPGlucHV0LW51bWJlciAqbmdJZj1cImNvbHVtbi5kYXRhVHlwZSA9PSAyXCIgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmRhdGFdXCI+PC9pbnB1dC1udW1iZXI+XG4gICAgICAgICAgPGlucHV0LWN1cnJlbmN5ICpuZ0lmPVwiY29sdW1uLmRhdGFUeXBlID09IDNcIiBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uZGF0YV1cIj48L2lucHV0LWN1cnJlbmN5PlxuICAgICAgICAgIDxpbnB1dC1wZXJjZW50ICpuZ0lmPVwiY29sdW1uLmRhdGFUeXBlID09IDRcIiBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uZGF0YV1cIj48L2lucHV0LXBlcmNlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBcbiAgPHVsIGNsYXNzPVwiZmFkZUluRG93blwiICpuZ0lmPVwicm93W2NvbGxlY3Rpb25Qcm9wZXJ0eV0/Lmxlbmd0aCA+IDAgJiYgb3Blbm5lZFwiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgc3ViaXRlbSBvZiByb3dbY29sbGVjdGlvblByb3BlcnR5XTsgbGV0IGZpcnN0ID0gZmlyc3Q7IGxldCBsYXN0ID0gbGFzdDtcIiBcbiAgICAgIHVpLXRyZWUtdmlldy1pdGVtXG4gICAgICBbcm93XT1cInN1Yml0ZW1cIlxuICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgICBbaWRQcm9wZXJ0eV09XCJpZFByb3BlcnR5XCJcbiAgICAgIFtsYWJlbFByb3BlcnR5XT1cImxhYmVsUHJvcGVydHlcIlxuICAgICAgW2NvbGxlY3Rpb25Qcm9wZXJ0eV09XCJjb2xsZWN0aW9uUHJvcGVydHlcIlxuICAgICAgW3Nob3dJY29uc109XCJzaG93SWNvbnNcIlxuICAgICAgW2VuYWJsZUxhYmVsTGlua1N0eWxlXT1cImVuYWJsZUxhYmVsTGlua1N0eWxlXCJcbiAgICAgIFtub3JtYWxJdGVtSWNvbkNsYXNzXT1cIm5vcm1hbEl0ZW1JY29uQ2xhc3NcIlxuICAgICAgW2NvbGxhcHNhYmxlQ2xvc2VkSXRlbUljb25DbGFzc109XCJjb2xsYXBzYWJsZUNsb3NlZEl0ZW1JY29uQ2xhc3NcIlxuICAgICAgW2NvbGxhcHNhYmxlT3Blbm5lZEl0ZW1JY29uQ2xhc3NdPVwiY29sbGFwc2FibGVPcGVubmVkSXRlbUljb25DbGFzc1wiXG4gICAgICBbZmlyc3RdPVwiZmlyc3RcIlxuICAgICAgW2xhc3RdPVwibGFzdFwiXG4gICAgICBbZXhwYW5kZWRPbkluaXRdPVwiZXhwYW5kZWRPbkluaXRcIlxuICAgICAgW3Nob3dJY29uc109XCJzaG93SWNvbnNcIlxuICAgICAgKE9uSXRlbUV4cGFuZGVkKT1cIkhhbmRsZVN1Ykl0ZW1FeHBhbmRlZCgkZXZlbnQpXCJcbiAgICAgIChPbkl0ZW1DbGlja2VkKT1cIkhhbmRsZVN1Ykl0ZW1DbGlja2VkKCRldmVudClcIlxuICAgICAgPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cbiJdfQ==