@csvbox/angular2
Version:
Standalone Angular component for csvbox.io supporting Angular version 14 till 20
331 lines • 43.3 kB
JavaScript
import { Component, ViewChild, Input, SecurityContext } from '@angular/core';
import { insertCSS } from './utils/insertCSS';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
const appVersion = '1.1.16';
export class CSVBoxButtonComponent {
constructor(sanitizer) {
this.sanitizer = sanitizer;
this.isModalShown = false;
this.user = null;
this.dynamicColumns = null;
this.licenseKey = null;
this.options = null;
this.uuid = '';
this.customDomain = null;
this.dataLocation = null;
this.language = null;
this.environment = null;
this.theme = null;
this.isIframeLoaded = false;
this.openModalOnIframeLoad = false;
this.lazy = false;
this.safeUrl = null;
this.iframe = null;
this.disabled = true;
this.holder = null;
}
ngOnInit() {
this.uuid = this.generateUuid();
let domain = this.customDomain ? this.customDomain : "app.csvbox.io";
if (this.dataLocation) {
domain = `${this.dataLocation}-${domain}`;
}
let iframeUrl = `https://${domain}/embed/${this.licenseKey}`;
iframeUrl += `?library-version=${appVersion}`;
iframeUrl += "&framework=angular";
if (this.dataLocation) {
iframeUrl += "&preventRedirect";
}
if (this.language) {
iframeUrl += "&language=" + this.language;
}
if (this.theme) {
iframeUrl += "&theme=" + this.theme;
}
if (this.environment) {
const environment = JSON.stringify(this.environment).replace(/['"]/g, (match) => '\\' + match);
iframeUrl += `&env=${environment}`;
}
this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
}
generateUuid() {
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
}
ngOnChanges(changes) {
if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) {
this.updateUserVariable(changes['user'].currentValue);
}
}
updateUserVariable(data) {
this.user = data;
if (this.iframe && this.iframe.contentWindow) {
this.iframe.contentWindow.postMessage({
"customer": data
}, "*");
}
}
ngAfterContentInit() {
window.addEventListener("message", (event) => {
if (event && typeof event.data === "object") {
if (event.data && event.data.data && event.data.data.unique_token === this.uuid) {
if (event.data.type && event.data.type === "data-on-submit") {
const metadata = event.data.data;
metadata["column_mappings"] = event.data.column_mapping;
delete metadata["unique_token"];
if (this.onSubmit)
this.onSubmit(metadata);
if (this.isSubmitted)
this.isSubmitted(metadata);
if (this.submitted)
this.submitted();
}
else if (event.data.type && event.data.type === "data-push-status") {
if (event.data.data.import_status === "success") {
if (event.data.row_data) {
const primary_row_data = event.data.row_data;
const headers = event.data.headers;
const rows = [];
const dynamic_columns_indexes = event.data.dynamicColumnsIndexes;
const virtual_columns_indexes = event.data.virtualColumnsIndexes || [];
primary_row_data.forEach((row_data) => {
const x = {};
const dynamic_columns = {};
const virtual_data = {};
row_data.data && row_data.data.forEach((col, i) => {
if (col === undefined) {
col = "";
}
if (dynamic_columns_indexes.includes(i)) {
dynamic_columns[headers[i]] = col;
}
else if (virtual_columns_indexes.includes(i)) {
virtual_data[headers[i]] = col;
}
else {
x[headers[i]] = col;
}
});
if (row_data && row_data.unmapped_data) {
x["_unmapped_data"] = row_data.unmapped_data;
}
if (dynamic_columns && Object.keys(dynamic_columns).length > 0) {
x["_dynamic_data"] = dynamic_columns;
}
if (virtual_data && Object.keys(virtual_data).length > 0) {
x["_virtual_data"] = virtual_data;
}
rows.push(x);
});
const metadata = event.data.data;
metadata["rows"] = rows;
metadata["column_mappings"] = event.data.column_mapping;
metadata["raw_columns"] = event.data.raw_columns;
metadata["ignored_columns"] = event.data.ignored_column_row;
delete metadata["unique_token"];
if (this.onImport)
this.onImport(true, metadata);
if (this.isImported)
this.isImported(true, metadata);
if (this.imported)
this.imported(true, metadata);
}
else {
const metadata = event.data.data;
delete metadata["unique_token"];
if (this.onImport)
this.onImport(true, metadata);
if (this.isImported)
this.isImported(true, metadata);
if (this.imported)
this.imported(true, metadata);
}
}
else {
const metadata = event.data.data;
delete metadata["unique_token"];
if (this.onImport)
this.onImport(false, metadata);
if (this.isImported)
this.isImported(false, metadata);
if (this.imported)
this.imported(false, metadata);
}
}
else if (event.data.type && event.data.type === "csvbox-modal-hidden") {
if (this.holder)
this.holder.style.display = 'none';
this.isModalShown = false;
if (this.onClose)
this.onClose();
if (this.isClosed)
this.isClosed();
if (this.closed)
this.closed();
}
else if (event.data.type && event.data.type === "csvbox-upload-successful") {
if (this.onImport)
this.onImport(true);
if (this.isImported)
this.isImported(true);
if (this.imported)
this.imported(true);
}
else if (event.data.type && event.data.type === "csvbox-upload-failed") {
if (this.onImport)
this.onImport(false);
if (this.isImported)
this.isImported(false);
if (this.imported)
this.imported(false);
}
}
}
}, false);
if (this.lazy) {
this.disabled = false;
}
else {
this.disabled = true;
this.initImporter();
}
}
initImporter() {
if (this.loadStarted)
this.loadStarted();
insertCSS();
const iframe = document.createElement("iframe");
this.iframe = iframe;
iframe.setAttribute("src", this.safeUrl?.toString() || '');
iframe.frameBorder = "0";
const self = this;
iframe.onload = function () {
if (self.onReady)
self.onReady();
if (self.isReady)
self.isReady();
if (self.importerReady)
self.importerReady();
self.disabled = false;
self.isIframeLoaded = true;
if (self.iframe && self.iframe.contentWindow) {
self.iframe.contentWindow.postMessage({
"customer": self.user ? self.user : null,
"columns": self.dynamicColumns ? self.dynamicColumns : null,
"options": self.options ? self.options : null,
"unique_token": self.uuid
}, "*");
}
if (self.openModalOnIframeLoad) {
self.openModal();
}
};
this.holder = document.createElement('div');
this.holder.classList.add('csvbox-holder');
this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);
this.holder.appendChild(iframe);
document.body.insertAdjacentElement('beforeend', this.holder);
}
openModal() {
if (this.lazy) {
if (!this.iframe) {
this.openModalOnIframeLoad = true;
this.initImporter();
return;
}
}
if (!this.isModalShown) {
if (this.isIframeLoaded) {
this.isModalShown = true;
if (this.holder)
this.holder.style.display = 'block';
if (this.iframe && this.iframe.contentWindow) {
this.iframe.contentWindow.postMessage('openModal', '*');
}
}
else {
this.openModalOnIframeLoad = true;
}
}
}
}
CSVBoxButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
CSVBoxButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CSVBoxButtonComponent, isStandalone: true, selector: "csvbox-button", inputs: { onImport: "onImport", onReady: "onReady", onClose: "onClose", onSubmit: "onSubmit", isImported: "isImported", isReady: "isReady", isClosed: "isClosed", isSubmitted: "isSubmitted", importerReady: "importerReady", closed: "closed", submitted: "submitted", imported: "imported", loadStarted: "loadStarted", user: "user", dynamicColumns: "dynamicColumns", licenseKey: "licenseKey", options: "options", uuid: "uuid", customDomain: "customDomain", dataLocation: "dataLocation", language: "language", environment: "environment", theme: "theme", isIframeLoaded: "isIframeLoaded", openModalOnIframeLoad: "openModalOnIframeLoad", lazy: "lazy", disabled: "disabled" }, viewQueries: [{ propertyName: "initiator", first: true, predicate: ["initiator"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
<div>
<button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid">
<ng-content></ng-content>
</button>
</div>
`, isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, decorators: [{
type: Component,
args: [{
selector: 'csvbox-button',
standalone: true,
template: `
<div>
<button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid">
<ng-content></ng-content>
</button>
</div>
`
}]
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { initiator: [{
type: ViewChild,
args: ['initiator', { static: false }]
}], onImport: [{
type: Input
}], onReady: [{
type: Input
}], onClose: [{
type: Input
}], onSubmit: [{
type: Input
}], isImported: [{
type: Input
}], isReady: [{
type: Input
}], isClosed: [{
type: Input
}], isSubmitted: [{
type: Input
}], importerReady: [{
type: Input
}], closed: [{
type: Input
}], submitted: [{
type: Input
}], imported: [{
type: Input
}], loadStarted: [{
type: Input
}], user: [{
type: Input
}], dynamicColumns: [{
type: Input
}], licenseKey: [{
type: Input
}], options: [{
type: Input
}], uuid: [{
type: Input
}], customDomain: [{
type: Input
}], dataLocation: [{
type: Input
}], language: [{
type: Input
}], environment: [{
type: Input
}], theme: [{
type: Input
}], isIframeLoaded: [{
type: Input
}], openModalOnIframeLoad: [{
type: Input
}], lazy: [{
type: Input
}], disabled: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxTQUFTLEVBQ1QsS0FBSyxFQUdMLGVBQWUsRUFFaEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFOUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDO0FBYzVCLE1BQU0sT0FBTyxxQkFBcUI7SUE0Q2hDLFlBQW1CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUExQzFDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBbUJaLFNBQUksR0FBa0MsSUFBSSxDQUFDO1FBQzNDLG1CQUFjLEdBQWtDLElBQUksQ0FBQztRQUNyRCxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxZQUFPLEdBQWtDLElBQUksQ0FBQztRQUM5QyxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDL0IsZ0JBQVcsR0FBa0MsSUFBSSxDQUFDO1FBRWxELFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBRTVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUV2QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBRS9CLFlBQU8sR0FBbUIsSUFBSSxDQUFDO1FBRS9CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBRS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFJbEMsV0FBTSxHQUEwQixJQUFJLENBQUM7SUFGUSxDQUFDO0lBSTlDLFFB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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBTZWN1cml0eUNvbnRleHQsXHJcbiAgQWZ0ZXJDb250ZW50SW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IGluc2VydENTUyB9IGZyb20gJy4vdXRpbHMvaW5zZXJ0Q1NTJztcclxuXHJcbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjE2JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAjaW5pdGlhdG9yIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cclxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgYFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIENTVkJveEJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgaXNNb2RhbFNob3duID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2luaXRpYXRvcicsIHsgc3RhdGljOiBmYWxzZSB9KSBpbml0aWF0b3I6IGFueTtcclxuICBASW5wdXQoKSBvbkltcG9ydD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBvblJlYWR5PzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBvbkNsb3NlPzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBvblN1Ym1pdD86IChtZXRhZGF0YTogYW55KSA9PiB2b2lkO1xyXG5cclxuICBASW5wdXQoKSBpc0ltcG9ydGVkPzogKHN1Y2Nlc3M6IGJvb2xlYW4sIG1ldGFkYXRhPzogYW55KSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIGlzUmVhZHk/OiAoKSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBpc1N1Ym1pdHRlZD86IChtZXRhZGF0YTogYW55KSA9PiB2b2lkO1xyXG5cclxuICBASW5wdXQoKSBpbXBvcnRlclJlYWR5PzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBjbG9zZWQ/OiAoKSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86ICgpID0+IHZvaWQ7XHJcbiAgQElucHV0KCkgaW1wb3J0ZWQ/OiAoc3VjY2VzczogYm9vbGVhbiwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XHJcbiAgQElucHV0KCkgbG9hZFN0YXJ0ZWQ/OiAoKSA9PiB2b2lkO1xyXG5cclxuICBASW5wdXQoKSB1c2VyOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBkYXRhTG9jYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBlbnZpcm9ubWVudDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc2FmZVVybDogU2FmZVVybCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7fVxyXG5cclxuICBob2xkZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy51dWlkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcclxuICAgIGxldCBkb21haW4gPSB0aGlzLmN1c3RvbURvbWFpbiA/IHRoaXMuY3VzdG9tRG9tYWluIDogXCJhcHAuY3N2Ym94LmlvXCI7XHJcbiAgICBpZiAodGhpcy5kYXRhTG9jYXRpb24pIHsgZG9tYWluID0gYCR7dGhpcy5kYXRhTG9jYXRpb259LSR7ZG9tYWlufWA7IH1cclxuICAgIGxldCBpZnJhbWVVcmwgPSBgaHR0cHM6Ly8ke2RvbWFpbn0vZW1iZWQvJHt0aGlzLmxpY2Vuc2VLZXl9YDtcclxuICAgIGlmcmFtZVVybCArPSBgP2xpYnJhcnktdmVyc2lvbj0ke2FwcFZlcnNpb259YDtcclxuICAgIGlmcmFtZVVybCArPSBcIiZmcmFtZXdvcms9YW5ndWxhclwiO1xyXG4gICAgaWYgKHRoaXMuZGF0YUxvY2F0aW9uKSB7XHJcbiAgICAgIGlmcmFtZVVybCArPSBcIiZwcmV2ZW50UmVkaXJlY3RcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxhbmd1YWdlKSB7XHJcbiAgICAgIGlmcmFtZVVybCArPSBcIiZsYW5ndWFnZT1cIiArIHRoaXMubGFuZ3VhZ2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50aGVtZSkge1xyXG4gICAgICBpZnJhbWVVcmwgKz0gXCImdGhlbWU9XCIgKyB0aGlzLnRoZW1lO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQpIHtcclxuICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmVudmlyb25tZW50KS5yZXBsYWNlKC9bJ1wiXS9nLCAobWF0Y2gpID0+ICdcXFxcJyArIG1hdGNoKTtcclxuICAgICAgaWZyYW1lVXJsICs9IGAmZW52PSR7ZW52aXJvbm1lbnR9YDtcclxuICAgIH1cclxuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlVXVpZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3VzZXInXSAmJiBjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWyd1c2VyJ10ucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJsZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVVzZXJWYXJpYWJsZShkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXIgPSBkYXRhO1xyXG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcclxuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgXCJjdXN0b21lclwiOiBkYXRhXHJcbiAgICAgIH0sIFwiKlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQgJiYgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLmRhdGEgJiYgZXZlbnQuZGF0YS5kYXRhLnVuaXF1ZV90b2tlbiA9PT0gdGhpcy51dWlkKSB7XHJcbiAgICAgICAgICBpZiAoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PT0gXCJkYXRhLW9uLXN1Ym1pdFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICBtZXRhZGF0YVtcImNvbHVtbl9tYXBwaW5nc1wiXSA9IGV2ZW50LmRhdGEuY29sdW1uX21hcHBpbmc7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWV0YWRhdGEpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PT0gXCJkYXRhLXB1c2gtc3RhdHVzXCIpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGF0YS5pbXBvcnRfc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnJvd19kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5X3Jvd19kYXRhID0gZXZlbnQuZGF0YS5yb3dfZGF0YTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBldmVudC5kYXRhLmhlYWRlcnM7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY19jb2x1bW5zX2luZGV4ZXMgPSBldmVudC5kYXRhLmR5bmFtaWNDb2x1bW5zSW5kZXhlcztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxfY29sdW1uc19pbmRleGVzID0gZXZlbnQuZGF0YS52aXJ0dWFsQ29sdW1uc0luZGV4ZXMgfHwgW107XHJcblxyXG4gICAgICAgICAgICAgICAgcHJpbWFyeV9yb3dfZGF0YS5mb3JFYWNoKChyb3dfZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHg6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY19jb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxfZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgcm93X2RhdGEuZGF0YSAmJiByb3dfZGF0YS5kYXRhLmZvckVhY2goKGNvbDogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sID09PSB1bmRlZmluZWQpIHsgY29sID0gXCJcIjsgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19jb2x1bW5zX2luZGV4ZXMuaW5jbHVkZXMoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfY29sdW1uc1toZWFkZXJzW2ldXSA9IGNvbDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZpcnR1YWxfY29sdW1uc19pbmRleGVzLmluY2x1ZGVzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX2RhdGFbaGVhZGVyc1tpXV0gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHhbaGVhZGVyc1tpXV0gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJvd19kYXRhICYmIHJvd19kYXRhLnVubWFwcGVkX2RhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB4W1wiX3VubWFwcGVkX2RhdGFcIl0gPSByb3dfZGF0YS51bm1hcHBlZF9kYXRhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChkeW5hbWljX2NvbHVtbnMgJiYgT2JqZWN0LmtleXMoZHluYW1pY19jb2x1bW5zKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeFtcIl9keW5hbWljX2RhdGFcIl0gPSBkeW5hbWljX2NvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKHZpcnR1YWxfZGF0YSAmJiBPYmplY3Qua2V5cyh2aXJ0dWFsX2RhdGEpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB4W1wiX3ZpcnR1YWxfZGF0YVwiXSA9IHZpcnR1YWxfZGF0YTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByb3dzLnB1c2goeCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJyb3dzXCJdID0gcm93cztcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wiY29sdW1uX21hcHBpbmdzXCJdID0gZXZlbnQuZGF0YS5jb2x1bW5fbWFwcGluZztcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wicmF3X2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLnJhd19jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJpZ25vcmVkX2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLmlnbm9yZWRfY29sdW1uX3JvdztcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBldmVudC5kYXRhLmRhdGE7XHJcbiAgICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9uQ2xvc2UpIHRoaXMub25DbG9zZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHRoaXMuY2xvc2VkKCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5sYXp5KSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEltcG9ydGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcclxuXHJcbiAgICBpbnNlcnRDU1MoKTtcclxuXHJcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XHJcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHRoaXMuc2FmZVVybD8udG9TdHJpbmcoKSB8fCAnJyk7XHJcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuXHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmIChzZWxmLm9uUmVhZHkpIHNlbGYub25SZWFkeSgpO1xyXG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcclxuICAgICAgaWYgKHNlbGYuaW1wb3J0ZXJSZWFkeSkgc2VsZi5pbXBvcnRlclJlYWR5KCk7XHJcblxyXG4gICAgICBzZWxmLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIHNlbGYuaXNJZnJhbWVMb2FkZWQgPSB0cnVlO1xyXG4gICAgICBpZiAoc2VsZi5pZnJhbWUgJiYgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdykge1xyXG4gICAgICAgIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgXCJjdXN0b21lclwiOiBzZWxmLnVzZXIgPyBzZWxmLnVzZXIgOiBudWxsLFxyXG4gICAgICAgICAgXCJjb2x1bW5zXCI6IHNlbGYuZHluYW1pY0NvbHVtbnMgPyBzZWxmLmR5bmFtaWNDb2x1bW5zIDogbnVsbCxcclxuICAgICAgICAgIFwib3B0aW9uc1wiOiBzZWxmLm9wdGlvbnMgPyBzZWxmLm9wdGlvbnMgOiBudWxsLFxyXG4gICAgICAgICAgXCJ1bmlxdWVfdG9rZW5cIjogc2VsZi51dWlkXHJcbiAgICAgICAgfSwgXCIqXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xyXG4gICAgICAgIHNlbGYub3Blbk1vZGFsKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xyXG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XHJcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG5cclxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxyXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5sYXp5KSB7XHJcbiAgICAgIGlmICghdGhpcy5pZnJhbWUpIHtcclxuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pc01vZGFsU2hvd24pIHtcclxuICAgICAgaWYgKHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcclxuICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xyXG4gICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==