@spartacus/order
Version:
Order feature library for Spartacus
91 lines • 36.5 kB
JavaScript
import { ChangeDetectionStrategy, Component, ViewChild, } from '@angular/core';
import { combineLatest, Subscription } from 'rxjs';
import { map, take, tap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
import * as i2 from "@spartacus/order/root";
import * as i3 from "@spartacus/storefront";
import * as i4 from "@angular/common";
import * as i5 from "@angular/router";
export class ReplenishmentOrderHistoryComponent {
constructor(routing, userReplenishmentOrderService, translation, vcr, launchDialogService) {
this.routing = routing;
this.userReplenishmentOrderService = userReplenishmentOrderService;
this.translation = translation;
this.vcr = vcr;
this.launchDialogService = launchDialogService;
this.subscription = new Subscription();
this.PAGE_SIZE = 5;
this.replenishmentOrders$ = this.userReplenishmentOrderService
.getReplenishmentOrderHistoryList(this.PAGE_SIZE)
.pipe(tap((replenishmentOrders) => {
var _a;
if ((_a = replenishmentOrders === null || replenishmentOrders === void 0 ? void 0 : replenishmentOrders.pagination) === null || _a === void 0 ? void 0 : _a.sort) {
this.sortType = replenishmentOrders.pagination.sort;
}
}));
this.isLoaded$ = this.userReplenishmentOrderService.getReplenishmentOrderHistoryListSuccess();
}
changeSortCode(sortCode) {
const event = {
sortCode,
currentPage: 0,
};
this.sortType = sortCode;
this.fetchReplenishmentOrders(event);
}
pageChange(page) {
const event = {
sortCode: this.sortType,
currentPage: page,
};
this.fetchReplenishmentOrders(event);
}
goToOrderDetail(order) {
this.routing.go({
cxRoute: 'replenishmentDetails',
params: order,
});
}
getSortLabels() {
return combineLatest([
this.translation.translate('sorting.date'),
this.translation.translate('sorting.replenishmentNumber'),
this.translation.translate('sorting.nextOrderDate'),
]).pipe(map(([textByDate, textByOrderNumber, textbyNextOrderDate]) => {
return {
byDate: textByDate,
byReplenishmentNumber: textByOrderNumber,
byNextOrderDate: textbyNextOrderDate,
};
}));
}
openDialog(event, replenishmentOrderCode) {
const dialog = this.launchDialogService.openDialog("REPLENISHMENT_ORDER" /* REPLENISHMENT_ORDER */, this.element, this.vcr, replenishmentOrderCode);
if (dialog) {
this.subscription.add(dialog.pipe(take(1)).subscribe());
}
event.stopPropagation();
}
fetchReplenishmentOrders(event) {
this.userReplenishmentOrderService.loadReplenishmentOrderList(this.PAGE_SIZE, event.currentPage, event.sortCode);
}
ngOnDestroy() {
this.subscription.unsubscribe();
this.userReplenishmentOrderService.clearReplenishmentOrderList();
}
}
ReplenishmentOrderHistoryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReplenishmentOrderHistoryComponent, deps: [{ token: i1.RoutingService }, { token: i2.ReplenishmentOrderFacade }, { token: i1.TranslationService }, { token: i0.ViewContainerRef }, { token: i3.LaunchDialogService }], target: i0.ɵɵFactoryTarget.Component });
ReplenishmentOrderHistoryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: ReplenishmentOrderHistoryComponent, selector: "cx-replenishment-order-history", viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"replenishmentOrders$ | async as replenishmentOrders\">\n <div class=\"container\">\n <!-- HEADER -->\n <div class=\"cx-replenishment-order-history-header\">\n <h3>\n {{ 'orderHistory.replenishmentOrderHistory' | cxTranslate }}\n </h3>\n </div>\n\n <!-- BODY -->\n <div class=\"cx-replenishment-order-history-body\">\n <ng-container\n *ngIf=\"replenishmentOrders.pagination.totalResults > 0; else noOrder\"\n >\n <!-- Select Form and Pagination Top -->\n <div class=\"cx-replenishment-order-history-sort top row\">\n <label\n class=\"\n cx-replenishment-order-history-form-group\n form-group\n col-sm-12 col-md-4 col-lg-4\n \"\n >\n <span>{{ 'orderHistory.sortBy' | cxTranslate }}</span>\n <cx-sorting\n [sortOptions]=\"replenishmentOrders.sorts\"\n [sortLabels]=\"getSortLabels() | async\"\n (sortListEvent)=\"changeSortCode($event)\"\n [selectedOption]=\"replenishmentOrders.pagination.sort\"\n placeholder=\"{{ 'orderHistory.sortBy' | cxTranslate }}\"\n ></cx-sorting>\n </label>\n <div\n class=\"cx-replenishment-order-history-pagination\"\n *ngIf=\"replenishmentOrders.pagination.totalPages > 1\"\n >\n <cx-pagination\n [pagination]=\"replenishmentOrders.pagination\"\n (viewPageEvent)=\"pageChange($event)\"\n ></cx-pagination>\n </div>\n </div>\n <!-- TABLE -->\n <table class=\"table cx-replenishment-order-history-table\">\n <thead class=\"cx-replenishment-order-history-thead-mobile\">\n <th scope=\"col\">\n <span class=\"cx-replenishment-order-history-ellipses\">\n {{ 'orderHistory.replenishmentOrderId' | cxTranslate }}\n </span>\n </th>\n <th scope=\"col\">\n <span class=\"cx-replenishment-order-history-ellipses\">\n {{ 'orderHistory.purchaseOrderNumber' | cxTranslate }}\n </span>\n </th>\n <th scope=\"col\">\n <span class=\"cx-replenishment-order-history-ellipses\">\n {{ 'orderHistory.startOn' | cxTranslate }}\n </span>\n </th>\n <th scope=\"col\">\n <span class=\"cx-replenishment-order-history-ellipses\">\n {{ 'orderHistory.frequency' | cxTranslate }}\n </span>\n </th>\n <th scope=\"col\">\n <span class=\"cx-replenishment-order-history-ellipses\">\n {{ 'orderHistory.nextOrderDate' | cxTranslate }}\n </span>\n </th>\n <th scope=\"col\" class=\"cx-replenishment-order-history-total\">\n <span class=\"cx-replenishment-order-history-ellipses\">\n {{ 'orderHistory.total' | cxTranslate }}\n </span>\n </th>\n <th scope=\"col\"></th>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let order of replenishmentOrders.replenishmentOrders\"\n (click)=\"goToOrderDetail(order)\"\n >\n <td class=\"cx-replenishment-order-history-code\">\n <div class=\"d-md-none cx-replenishment-order-history-label\">\n {{ 'orderHistory.replenishmentOrderId' | cxTranslate }}\n </div>\n <a\n [routerLink]=\"\n {\n cxRoute: 'replenishmentDetails',\n params: order\n } | cxUrl\n \"\n class=\"cx-replenishment-order-history-value\"\n >\n {{ order?.replenishmentOrderCode }}</a\n >\n </td>\n <td>\n <div class=\"d-md-none cx-replenishment-order-history-label\">\n {{ 'orderHistory.purchaseOrderNumber' | cxTranslate }}\n </div>\n <a\n [routerLink]=\"\n {\n cxRoute: 'replenishmentDetails',\n params: order\n } | cxUrl\n \"\n class=\"\n cx-replenishment-order-history-value\n cx-purchase-order-number\n \"\n >\n {{\n order?.purchaseOrderNumber?.length > 0\n ? order?.purchaseOrderNumber\n : ('orderHistory.emptyPurchaseOrderId' | cxTranslate)\n }}\n </a>\n </td>\n <td>\n <div class=\"d-md-none cx-replenishment-order-history-label\">\n {{ 'orderHistory.startOn' | cxTranslate }}\n </div>\n <a\n [routerLink]=\"\n {\n cxRoute: 'replenishmentDetails',\n params: order\n } | cxUrl\n \"\n class=\"cx-replenishment-order-history-value\"\n >\n {{ order?.firstDate | cxDate: 'M/d/yyyy' }}</a\n >\n </td>\n <td class=\"cx-replenishment-order-history-frequency\">\n <div class=\"d-md-none cx-replenishment-order-history-label\">\n {{ 'orderHistory.frequency' | cxTranslate }}\n </div>\n <a\n [routerLink]=\"\n {\n cxRoute: 'replenishmentDetails',\n params: order\n } | cxUrl\n \"\n class=\"cx-replenishment-order-history-value\"\n >\n {{ order?.trigger.displayTimeTable | slice: 0:-12 }}\n </a>\n </td>\n <td>\n <div class=\"d-md-none cx-replenishment-order-history-label\">\n {{ 'orderHistory.nextOrderDate' | cxTranslate }}\n </div>\n\n <a\n [routerLink]=\"\n {\n cxRoute: 'replenishmentDetails',\n params: order\n } | cxUrl\n \"\n class=\"\n cx-replenishment-order-history-value cx-next-order-date\n \"\n >\n {{\n order?.active\n ? (order?.trigger.activationTime | cxDate: 'M/d/yyyy')\n : ('orderHistory.cancelled' | cxTranslate)\n }}\n </a>\n </td>\n <td class=\"cx-replenishment-order-history-total\">\n <div class=\"d-md-none cx-replenishment-order-history-label\">\n {{ 'orderHistory.total' | cxTranslate }}\n </div>\n <a\n [routerLink]=\"\n {\n cxRoute: 'replenishmentDetails',\n params: order\n } | cxUrl\n \"\n class=\"cx-replenishment-order-history-value\"\n >\n {{ order?.totalPriceWithTax.formattedValue }}</a\n >\n </td>\n <td class=\"cx-replenishment-order-history-cancel\">\n <div\n class=\"d-md-none cx-replenishment-order-history-label\"\n ></div>\n <button\n (click)=\"openDialog($event, order?.replenishmentOrderCode)\"\n class=\"cx-order-cancel btn btn-link\"\n #element\n *ngIf=\"order?.active\"\n >\n {{ 'orderHistory.cancel' | cxTranslate }}\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n <!-- Select Form and Pagination Bottom -->\n <div class=\"cx-replenishment-order-history-sort bottom row\">\n <div class=\"cx-replenishment-order-history-pagination\">\n <cx-pagination\n [pagination]=\"replenishmentOrders.pagination\"\n (viewPageEvent)=\"pageChange($event)\"\n *ngIf=\"replenishmentOrders.pagination.totalPages > 1\"\n ></cx-pagination>\n </div>\n </div>\n </ng-container>\n\n <!-- NO ORDER CONTAINER -->\n <ng-template #noOrder>\n <div\n class=\"cx-replenishment-order-history-no-order row\"\n *ngIf=\"isLoaded$ | async\"\n >\n <div class=\"col-sm-12 col-md-6 col-lg-4\">\n <div>{{ 'orderHistory.noReplenishmentOrders' | cxTranslate }}</div>\n <a\n [routerLink]=\"{ cxRoute: 'home' } | cxUrl\"\n routerLinkActive=\"active\"\n class=\"btn btn-primary btn-block\"\n >{{ 'orderHistory.startShopping' | cxTranslate }}</a\n >\n </div>\n </div>\n </ng-template>\n </div>\n </div>\n</ng-container>\n", components: [{ type: i3.SortingComponent, selector: "cx-sorting", inputs: ["sortOptions", "selectedOption", "placeholder", "sortLabels"], outputs: ["sortListEvent"] }, { type: i3.PaginationComponent, selector: "cx-pagination", inputs: ["pageRoute", "queryParam", "defaultPage", "pagination"], outputs: ["viewPageEvent"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i5.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], exportAs: ["routerLinkActive"] }], pipes: { "async": i4.AsyncPipe, "cxTranslate": i1.TranslatePipe, "cxUrl": i1.UrlPipe, "cxDate": i1.CxDatePipe, "slice": i4.SlicePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReplenishmentOrderHistoryComponent, decorators: [{
type: Component,
args: [{
selector: 'cx-replenishment-order-history',
templateUrl: './replenishment-order-history.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], ctorParameters: function () { return [{ type: i1.RoutingService }, { type: i2.ReplenishmentOrderFacade }, { type: i1.TranslationService }, { type: i0.ViewContainerRef }, { type: i3.LaunchDialogService }]; }, propDecorators: { element: [{
type: ViewChild,
args: ['element']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2ZlYXR1cmUtbGlicy9vcmRlci9jb21wb25lbnRzL3JlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS9yZXBsZW5pc2htZW50LW9yZGVyLWhpc3RvcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZmVhdHVyZS1saWJzL29yZGVyL2NvbXBvbmVudHMvcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5L3JlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFHVCxTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFTdkIsT0FBTyxFQUFFLGFBQWEsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFPaEQsTUFBTSxPQUFPLGtDQUFrQztJQXNCN0MsWUFDWSxPQUF1QixFQUN2Qiw2QkFBdUQsRUFDdkQsV0FBK0IsRUFDL0IsR0FBcUIsRUFDckIsbUJBQXdDO1FBSnhDLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBMEI7UUFDdkQsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQWtCO1FBQ3JCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUF4QjVDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVsQyxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLHlCQUFvQixHQUNsQixJQUFJLENBQUMsNkJBQTZCO2FBQy9CLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxTQUFT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LFdBQVcsRUFBRSw4Q0FBOEM7b0JBQzNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs4T0FFdUIsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgUmVwbGVuaXNobWVudE9yZGVyLFxuICBSZXBsZW5pc2htZW50T3JkZXJMaXN0LFxuICBSb3V0aW5nU2VydmljZSxcbiAgVHJhbnNsYXRpb25TZXJ2aWNlLFxufSBmcm9tICdAc3BhcnRhY3VzL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGVuaXNobWVudE9yZGVyRmFjYWRlIH0gZnJvbSAnQHNwYXJ0YWN1cy9vcmRlci9yb290JztcbmltcG9ydCB7IExhdW5jaERpYWxvZ1NlcnZpY2UsIExBVU5DSF9DQUxMRVIgfSBmcm9tICdAc3BhcnRhY3VzL3N0b3JlZnJvbnQnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBsZW5pc2htZW50T3JkZXJIaXN0b3J5Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZWxlbWVudCcpIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJpdmF0ZSBQQUdFX1NJWkUgPSA1O1xuICBzb3J0VHlwZTogc3RyaW5nO1xuXG4gIHJlcGxlbmlzaG1lbnRPcmRlcnMkOiBPYnNlcnZhYmxlPFJlcGxlbmlzaG1lbnRPcmRlckxpc3QgfCB1bmRlZmluZWQ+ID1cbiAgICB0aGlzLnVzZXJSZXBsZW5pc2htZW50T3JkZXJTZXJ2aWNlXG4gICAgICAuZ2V0UmVwbGVuaXNobWVudE9yZGVySGlzdG9yeUxpc3QodGhpcy5QQUdFX1NJWkUpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXBsZW5pc2htZW50T3JkZXJzOiBSZXBsZW5pc2htZW50T3JkZXJMaXN0IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcGxlbmlzaG1lbnRPcmRlcnM/LnBhZ2luYXRpb24/LnNvcnQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydFR5cGUgPSByZXBsZW5pc2htZW50T3JkZXJzLnBhZ2luYXRpb24uc29ydDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gIGlzTG9hZGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9XG4gICAgdGhpcy51c2VyUmVwbGVuaXNobWVudE9yZGVyU2VydmljZS5nZXRSZXBsZW5pc2htZW50T3JkZXJIaXN0b3J5TGlzdFN1Y2Nlc3MoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcm91dGluZzogUm91dGluZ1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHVzZXJSZXBsZW5pc2htZW50T3JkZXJTZXJ2aWNlOiBSZXBsZW5pc2htZW50T3JkZXJGYWNhZGUsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcm90ZWN0ZWQgbGF1bmNoRGlhbG9nU2VydmljZTogTGF1bmNoRGlhbG9nU2VydmljZVxuICApIHt9XG5cbiAgY2hhbmdlU29ydENvZGUoc29ydENvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50OiB7IHNvcnRDb2RlOiBzdHJpbmc7IGN1cnJlbnRQYWdlOiBudW1iZXIgfSA9IHtcbiAgICAgIHNvcnRDb2RlLFxuICAgICAgY3VycmVudFBhZ2U6IDAsXG4gICAgfTtcbiAgICB0aGlzLnNvcnRUeXBlID0gc29ydENvZGU7XG4gICAgdGhpcy5mZXRjaFJlcGxlbmlzaG1lbnRPcmRlcnMoZXZlbnQpO1xuICB9XG5cbiAgcGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBldmVudDogeyBzb3J0Q29kZTogc3RyaW5nOyBjdXJyZW50UGFnZTogbnVtYmVyIH0gPSB7XG4gICAgICBzb3J0Q29kZTogdGhpcy5zb3J0VHlwZSxcbiAgICAgIGN1cnJlbnRQYWdlOiBwYWdlLFxuICAgIH07XG4gICAgdGhpcy5mZXRjaFJlcGxlbmlzaG1lbnRPcmRlcnMoZXZlbnQpO1xuICB9XG5cbiAgZ29Ub09yZGVyRGV0YWlsKG9yZGVyOiBSZXBsZW5pc2htZW50T3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRpbmcuZ28oe1xuICAgICAgY3hSb3V0ZTogJ3JlcGxlbmlzaG1lbnREZXRhaWxzJyxcbiAgICAgIHBhcmFtczogb3JkZXIsXG4gICAgfSk7XG4gIH1cblxuICBnZXRTb3J0TGFiZWxzKCk6IE9ic2VydmFibGU8e1xuICAgIGJ5RGF0ZTogc3RyaW5nO1xuICAgIGJ5UmVwbGVuaXNobWVudE51bWJlcjogc3RyaW5nO1xuICAgIGJ5TmV4dE9yZGVyRGF0ZTogc3RyaW5nO1xuICB9PiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ3NvcnRpbmcuZGF0ZScpLFxuICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ3NvcnRpbmcucmVwbGVuaXNobWVudE51bWJlcicpLFxuICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ3NvcnRpbmcubmV4dE9yZGVyRGF0ZScpLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt0ZXh0QnlEYXRlLCB0ZXh0QnlPcmRlck51bWJlciwgdGV4dGJ5TmV4dE9yZGVyRGF0ZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBieURhdGU6IHRleHRCeURhdGUsXG4gICAgICAgICAgYnlSZXBsZW5pc2htZW50TnVtYmVyOiB0ZXh0QnlPcmRlck51bWJlcixcbiAgICAgICAgICBieU5leHRPcmRlckRhdGU6IHRleHRieU5leHRPcmRlckRhdGUsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvcGVuRGlhbG9nKGV2ZW50OiBFdmVudCwgcmVwbGVuaXNobWVudE9yZGVyQ29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nID0gdGhpcy5sYXVuY2hEaWFsb2dTZXJ2aWNlLm9wZW5EaWFsb2coXG4gICAgICBMQVVOQ0hfQ0FMTEVSLlJFUExFTklTSE1FTlRfT1JERVIsXG4gICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICB0aGlzLnZjcixcbiAgICAgIHJlcGxlbmlzaG1lbnRPcmRlckNvZGVcbiAgICApO1xuXG4gICAgaWYgKGRpYWxvZykge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKGRpYWxvZy5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgpKTtcbiAgICB9XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoUmVwbGVuaXNobWVudE9yZGVycyhldmVudDoge1xuICAgIHNvcnRDb2RlOiBzdHJpbmc7XG4gICAgY3VycmVudFBhZ2U6IG51bWJlcjtcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMudXNlclJlcGxlbmlzaG1lbnRPcmRlclNlcnZpY2UubG9hZFJlcGxlbmlzaG1lbnRPcmRlckxpc3QoXG4gICAgICB0aGlzLlBBR0VfU0laRSxcbiAgICAgIGV2ZW50LmN1cnJlbnRQYWdlLFxuICAgICAgZXZlbnQuc29ydENvZGVcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnVzZXJSZXBsZW5pc2htZW50T3JkZXJTZXJ2aWNlLmNsZWFyUmVwbGVuaXNobWVudE9yZGVyTGlzdCgpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwicmVwbGVuaXNobWVudE9yZGVycyQgfCBhc3luYyBhcyByZXBsZW5pc2htZW50T3JkZXJzXCI+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICA8IS0tIEhFQURFUiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LWhlYWRlclwiPlxuICAgICAgPGgzPlxuICAgICAgICB7eyAnb3JkZXJIaXN0b3J5LnJlcGxlbmlzaG1lbnRPcmRlckhpc3RvcnknIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgIDwvaDM+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJPRFkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImN4LXJlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS1ib2R5XCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwicmVwbGVuaXNobWVudE9yZGVycy5wYWdpbmF0aW9uLnRvdGFsUmVzdWx0cyA+IDA7IGVsc2Ugbm9PcmRlclwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gU2VsZWN0IEZvcm0gYW5kIFBhZ2luYXRpb24gVG9wIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXNvcnQgdG9wIHJvd1wiPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LWZvcm0tZ3JvdXBcbiAgICAgICAgICAgICAgZm9ybS1ncm91cFxuICAgICAgICAgICAgICBjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ29yZGVySGlzdG9yeS5zb3J0QnknIHwgY3hUcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8Y3gtc29ydGluZ1xuICAgICAgICAgICAgICBbc29ydE9wdGlvbnNdPVwicmVwbGVuaXNobWVudE9yZGVycy5zb3J0c1wiXG4gICAgICAgICAgICAgIFtzb3J0TGFiZWxzXT1cImdldFNvcnRMYWJlbHMoKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgKHNvcnRMaXN0RXZlbnQpPVwiY2hhbmdlU29ydENvZGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtzZWxlY3RlZE9wdGlvbl09XCJyZXBsZW5pc2htZW50T3JkZXJzLnBhZ2luYXRpb24uc29ydFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ29yZGVySGlzdG9yeS5zb3J0QnknIHwgY3hUcmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgPjwvY3gtc29ydGluZz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXBhZ2luYXRpb25cIlxuICAgICAgICAgICAgKm5nSWY9XCJyZXBsZW5pc2htZW50T3JkZXJzLnBhZ2luYXRpb24udG90YWxQYWdlcyA+IDFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjeC1wYWdpbmF0aW9uXG4gICAgICAgICAgICAgIFtwYWdpbmF0aW9uXT1cInJlcGxlbmlzaG1lbnRPcmRlcnMucGFnaW5hdGlvblwiXG4gICAgICAgICAgICAgICh2aWV3UGFnZUV2ZW50KT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9jeC1wYWdpbmF0aW9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBUQUJMRSAtLT5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXRhYmxlXCI+XG4gICAgICAgICAgPHRoZWFkIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXRoZWFkLW1vYmlsZVwiPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LWVsbGlwc2VzXCI+XG4gICAgICAgICAgICAgICAge3sgJ29yZGVySGlzdG9yeS5yZXBsZW5pc2htZW50T3JkZXJJZCcgfCBjeFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LWVsbGlwc2VzXCI+XG4gICAgICAgICAgICAgICAge3sgJ29yZGVySGlzdG9yeS5wdXJjaGFzZU9yZGVyTnVtYmVyJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjeC1yZXBsZW5pc2htZW50LW9yZGVyLWhpc3RvcnktZWxsaXBzZXNcIj5cbiAgICAgICAgICAgICAgICB7eyAnb3JkZXJIaXN0b3J5LnN0YXJ0T24nIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN4LXJlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS1lbGxpcHNlc1wiPlxuICAgICAgICAgICAgICAgIHt7ICdvcmRlckhpc3RvcnkuZnJlcXVlbmN5JyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjeC1yZXBsZW5pc2htZW50LW9yZGVyLWhpc3RvcnktZWxsaXBzZXNcIj5cbiAgICAgICAgICAgICAgICB7eyAnb3JkZXJIaXN0b3J5Lm5leHRPcmRlckRhdGUnIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXRvdGFsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LWVsbGlwc2VzXCI+XG4gICAgICAgICAgICAgICAge3sgJ29yZGVySGlzdG9yeS50b3RhbCcgfCBjeFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3JkZXIgb2YgcmVwbGVuaXNobWVudE9yZGVycy5yZXBsZW5pc2htZW50T3JkZXJzXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9PcmRlckRldGFpbChvcmRlcilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjeC1yZXBsZW5pc2htZW50LW9yZGVyLWhpc3RvcnktY29kZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW1kLW5vbmUgY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnb3JkZXJIaXN0b3J5LnJlcGxlbmlzaG1lbnRPcmRlcklkJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY3hSb3V0ZTogJ3JlcGxlbmlzaG1lbnREZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IG9yZGVyXG4gICAgICAgICAgICAgICAgICAgIH0gfCBjeFVybFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXZhbHVlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBvcmRlcj8ucmVwbGVuaXNobWVudE9yZGVyQ29kZSB9fTwvYVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW1kLW5vbmUgY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnb3JkZXJIaXN0b3J5LnB1cmNoYXNlT3JkZXJOdW1iZXInIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjeFJvdXRlOiAncmVwbGVuaXNobWVudERldGFpbHMnLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgfSB8IGN4VXJsXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICAgICAgY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGN4LXB1cmNoYXNlLW9yZGVyLW51bWJlclxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBvcmRlcj8ucHVyY2hhc2VPcmRlck51bWJlcj8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgID8gb3JkZXI/LnB1cmNoYXNlT3JkZXJOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICA6ICgnb3JkZXJIaXN0b3J5LmVtcHR5UHVyY2hhc2VPcmRlcklkJyB8IGN4VHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1tZC1ub25lIGN4LXJlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAge3sgJ29yZGVySGlzdG9yeS5zdGFydE9uJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY3hSb3V0ZTogJ3JlcGxlbmlzaG1lbnREZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IG9yZGVyXG4gICAgICAgICAgICAgICAgICAgIH0gfCBjeFVybFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXZhbHVlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBvcmRlcj8uZmlyc3REYXRlIHwgY3hEYXRlOiAnTS9kL3l5eXknIH19PC9hXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjeC1yZXBsZW5pc2htZW50LW9yZGVyLWhpc3RvcnktZnJlcXVlbmN5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbWQtbm9uZSBjeC1yZXBsZW5pc2htZW50LW9yZGVyLWhpc3RvcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdvcmRlckhpc3RvcnkuZnJlcXVlbmN5JyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY3hSb3V0ZTogJ3JlcGxlbmlzaG1lbnREZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IG9yZGVyXG4gICAgICAgICAgICAgICAgICAgIH0gfCBjeFVybFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXZhbHVlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBvcmRlcj8udHJpZ2dlci5kaXNwbGF5VGltZVRhYmxlIHwgc2xpY2U6IDA6LTEyIH19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbWQtbm9uZSBjeC1yZXBsZW5pc2htZW50LW9yZGVyLWhpc3RvcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdvcmRlckhpc3RvcnkubmV4dE9yZGVyRGF0ZScgfCBjeFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY3hSb3V0ZTogJ3JlcGxlbmlzaG1lbnREZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IG9yZGVyXG4gICAgICAgICAgICAgICAgICAgIH0gfCBjeFVybFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgICAgICAgIGN4LXJlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS12YWx1ZSBjeC1uZXh0LW9yZGVyLWRhdGVcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI/LmFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgID8gKG9yZGVyPy50cmlnZ2VyLmFjdGl2YXRpb25UaW1lIHwgY3hEYXRlOiAnTS9kL3l5eXknKVxuICAgICAgICAgICAgICAgICAgICAgIDogKCdvcmRlckhpc3RvcnkuY2FuY2VsbGVkJyB8IGN4VHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImN4LXJlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS10b3RhbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW1kLW5vbmUgY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnb3JkZXJIaXN0b3J5LnRvdGFsJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY3hSb3V0ZTogJ3JlcGxlbmlzaG1lbnREZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IG9yZGVyXG4gICAgICAgICAgICAgICAgICAgIH0gfCBjeFVybFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LXZhbHVlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBvcmRlcj8udG90YWxQcmljZVdpdGhUYXguZm9ybWF0dGVkVmFsdWUgfX08L2FcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImN4LXJlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS1jYW5jZWxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImQtbWQtbm9uZSBjeC1yZXBsZW5pc2htZW50LW9yZGVyLWhpc3RvcnktbGFiZWxcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkRpYWxvZygkZXZlbnQsIG9yZGVyPy5yZXBsZW5pc2htZW50T3JkZXJDb2RlKVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN4LW9yZGVyLWNhbmNlbCBidG4gYnRuLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgI2VsZW1lbnRcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3JkZXI/LmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgJ29yZGVySGlzdG9yeS5jYW5jZWwnIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPCEtLSBTZWxlY3QgRm9ybSBhbmQgUGFnaW5hdGlvbiBCb3R0b20gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjeC1yZXBsZW5pc2htZW50LW9yZGVyLWhpc3Rvcnktc29ydCBib3R0b20gcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN4LXJlcGxlbmlzaG1lbnQtb3JkZXItaGlzdG9yeS1wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgICA8Y3gtcGFnaW5hdGlvblxuICAgICAgICAgICAgICBbcGFnaW5hdGlvbl09XCJyZXBsZW5pc2htZW50T3JkZXJzLnBhZ2luYXRpb25cIlxuICAgICAgICAgICAgICAodmlld1BhZ2VFdmVudCk9XCJwYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAqbmdJZj1cInJlcGxlbmlzaG1lbnRPcmRlcnMucGFnaW5hdGlvbi50b3RhbFBhZ2VzID4gMVwiXG4gICAgICAgICAgICA+PC9jeC1wYWdpbmF0aW9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIE5PIE9SREVSIENPTlRBSU5FUiAtLT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9PcmRlcj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3gtcmVwbGVuaXNobWVudC1vcmRlci1oaXN0b3J5LW5vLW9yZGVyIHJvd1wiXG4gICAgICAgICAgKm5nSWY9XCJpc0xvYWRlZCQgfCBhc3luY1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC02IGNvbC1sZy00XCI+XG4gICAgICAgICAgICA8ZGl2Pnt7ICdvcmRlckhpc3Rvcnkubm9SZXBsZW5pc2htZW50T3JkZXJzJyB8IGN4VHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJ7IGN4Um91dGU6ICdob21lJyB9IHwgY3hVcmxcIlxuICAgICAgICAgICAgICByb3V0ZXJMaW5rQWN0aXZlPVwiYWN0aXZlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgPnt7ICdvcmRlckhpc3Rvcnkuc3RhcnRTaG9wcGluZycgfCBjeFRyYW5zbGF0ZSB9fTwvYVxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=