@posiwise/smart-crm 0.0.38 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -248,13 +248,13 @@ export class CrmActionsComponent extends AppBaseComponent {
248
248
  super.ngOnDestroy();
249
249
  }
250
250
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: CrmActionsComponent, deps: [{ token: i1.CrmService }, { token: i0.Injector }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
251
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: CrmActionsComponent, selector: "pw-crm-actions", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 mb-4\">\n <div class=\"col-12 mb-0\">\n <h2>{{ 'Crm.Actions.Title' | transloco }}</h2>\n </div>\n <div class=\"col-12 col-sm-3 float-start mb-2\"\n *ngIf=\"showFilter\">\n <select class=\"form-select\"\n (change)=\"filterByUser($event)\">\n <option value=\"0\">Filter by user</option>\n <option *ngFor=\"let member of allSubscriptionMembers\"\n [value]=\"member.id\">\n {{ member.first_name }} {{ member.last_name }}\n </option>\n </select>\n </div>\n <div>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n data-cy=\"add-opportunities\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end me-3\"\n data-cy=\"add-contact\"\n [routerLink]=\"['/' + subscription?.slug + routers.addAccount]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.AccountMessage.AddAccount' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end me-3\"\n [routerLink]=\"['/' + subscription?.slug + routers.contactAdd]\"\n data-cy=\"add-action\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.AddContact' | transloco }}\n </a>\n </div>\n </div>\n <!-- Pending Actions -->\n <div class=\"col-12 col-md-6 mb-3\">\n <h5 class=\"accordion-heading\">Pending Actions</h5>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"contactActions?.length === 0 && isLoaded\"\n class=\"px-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Actions.ActionMessage' | transloco\"> </pw-no-data>\n </div>\n <!-- wrapper for infinite scroll -->\n <div #selector class=\"pending-actions-wrapper\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [infiniteScrollContainer]=\"selector\"\n [fromRoot]=\"true\"\n (scrolled)=\"onScrollPendingActions()\">\n <div class=\"mb-4 action-card bg-white\"\n *ngFor=\"let action of contactActions; let i = index\">\n <div class=\"p-2\">\n <ul class=\"list-inline\">\n <li class=\"list-inline-item me-2\">\n <h6 *ngIf=\"!updating || actionId !== action.id\">\n {{ action.when_short_date }}\n </h6>\n <input *ngIf=\"updating && actionId === action.id\"\n placeholder=\"dd-mmm-yyyy\"\n [value]=\"action.when_short_date\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, action)\" />\n </li>\n <li>\n <button type=\"button\"\n class=\"btn btn-sm when-btn\"\n (click)=\"showDatePicker(action?.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n ngbTooltip=\"Click to Edit\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </li>\n <li class=\"list-inline-item\">\n <span class=\"badge bg-primary\">{{ action.crm_action?.name }}</span>\n </li>\n <li>\n <ng-container *ngIf=\"action.owner?.user_avatar?.length > 0; else noProfileImg\">\n <ng-container *ngFor=\"let owner_image of action.owner?.user_avatar\">\n <div class=\"text-center my-2\" *ngIf=\"owner_image.width === 50\" [ngbTooltip]=\"action.owner.first_name + ' ' +action.owner.last_name\">\n <div class=\"avatar avatar-image\">\n <img\n class=\"img-fluid\"\n [src]=\"owner_image.url\"\n alt=\"Male Icon\"\n (error)=\"handleImageError($event, 'assets/img/icons/male.png')\"\n />\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #noProfileImg>\n <div class=\"text-center my-2\">\n <div class=\"avatar avatar-image\">\n <img\n src=\"/assets/img/icons/male.png\"\n alt=\"\"\n class=\"img-fluid\"\n />\n </div>\n </div>\n </ng-template>\n </li>\n\n <li class=\"list-inline-item float-end\">\n <a *ngIf=\"action?.crm_contact\"\n ngbTooltip=\"See this contact\"\n aria-label=\"See this contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n action?.crm_contact?.id\n ]\">\n <i class=\"fa fa-eye me-3 see-icon\" aria-hidden=\"true\"></i>\n </a>\n <a ngbTooltip=\"Set as completed\"\n aria-label=\"Set as completed\"\n class=\"me-3\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCompleted(action.id, action, i)\">\n <i class=\"fa fa-tasks cta1-icon\" aria-hidden=\"true\"></i>\n </a>\n <a ngbTooltip=\"Set as cancelled\"\n aria-label=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(action.id, action, i)\">\n <i\n class=\"fa fa-times text-danger delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n </li>\n </ul>\n <p [class.text-danger]=\"!action.color\"\n class=\"mb-0\"\n *ngIf=\"action.due\">\n {{ action.due }}\n </p>\n <p *ngIf=\"action.owner?.id !== userId\"\n class=\"m-0 mt-1\">\n <a class=\"font-italic grey\"\n [routerLink]=\"['/members', action?.owner?.slug]\">Added by\n {{ action.owner?.first_name + ' ' + action.owner?.last_name }}</a>\n </p>\n <p class=\"mt-1 mb-1 fw-bold\">\n <a class=\"text-secondary\"\n *ngIf=\"action?.crm_contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n action?.crm_contact?.id\n ]\">\n {{\n action?.crm_contact?.first_name +\n ' ' +\n action?.crm_contact?.last_name\n }}\n </a>\n <a *ngIf=\"!action.crm_contact_id\">N/A</a> at\n <a *ngIf=\"action.crm_account_id\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n action?.crm_account?.id\n ]\">\n {{ action?.crm_account?.name }}\n </a>\n </p>\n <div class=\"comment-section\">\n <textarea class=\"mt-1 textarea form-control mb-2\"\n [(ngModel)]=\"action.comment\">{{ action.comment }}</textarea>\n <div class=\"d-flex\">\n <p class=\"my-1 comment\"\n *ngIf=\"!showFullComment || action.id !== commentId\">\n {{ action.comment | slice: 0:230\n }}<a *ngIf=\"action.comment.length > 230\"\n class=\"text-secondary\"\n (click)=\"showFullComment = true; commentId = action.id\">...show more\n </a>\n </p>\n <p class=\"my-1 comment\"\n *ngIf=\"showFullComment && action.id === commentId\">\n {{ action.comment }}\n <a *ngIf=\"action.comment.length > 230 && showFullComment\"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn\"\n (click)=\"editComment($event)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"control-btns edit-control-btns\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"editComment(undefined)\">\n {{ 'Button.Cancel' | transloco }}\n </button>\n <button class=\"btn btn-sm btn-primary\"\n (click)=\"updateComment(action)\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Suggested Actions -->\n <div class=\"col-12 col-md-6 mb-3\">\n <h5 class=\"accordion-heading\">AI Suggested Actions</h5>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n\n\n <div #suggestedActionsSelector *ngIf=\"accountActionSuggested?.length > 0\" class=\"suggested-actions-wrapper\"\n infiniteScroll\n [infiniteScrollContainer]=\"suggestedActionsSelector\"\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\">\n\n <div class=\"mb-4 action-card bg-white\"\n *ngFor=\"\n let suggestedAction of accountActionSuggested\n | paginate: { id: 'suggestedAction', itemsPerPage: 10, currentPage: p1 };\n let i = index\n \">\n <div class=\"p-2\">\n <p class=\"mt-1 mb-1 fw-bold\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n suggestedAction?.crm_account?.id\n ]\">{{ suggestedAction?.crm_account?.name }}</a>\n </p>\n <p class=\"fw-bold mb-1\">{{ suggestedAction.crm_action }}</p>\n <p class=\"mb-0\">{{ suggestedAction.reason }}</p>\n </div>\n </div>\n </div>\n <div class=\"text-center pagination-controls w-100 mt-3\"\n *ngIf=\"accountActionSuggested?.length > 10\">\n <pagination-controls id=\"suggestedAction\"\n (pageChange)=\"p1 = $event\">\n </pagination-controls>\n </div>\n <div *ngIf=\"accountActionSuggested.length === 0 && isLoadedSuggested\"\n class=\"px-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Actions.ActionSuggestionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n</div>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.textarea,.control-btns{display:none}.comment,.edit-btn{display:block}.comment{border:0;border-bottom:1px solid rgb(242,242,242);color:#000;font-size:1rem;resize:none}.textarea{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:17px}.comment-section{min-width:350px;padding-right:45px;position:relative}.comment-section p{word-break:break-all}.comment-section.show-controls .textarea,.comment-section.show-controls .control-btns{display:block}.comment-section.show-controls .comment,.comment-section.show-controls .edit-btn{display:none}.comment-section.show-controls .control-btns.edit-control-btns{display:flex;justify-content:flex-end}.edit-btn{margin-top:-15px}.avatar-image{height:25px;width:25px}.when-btn:focus{border:0;box-shadow:none}.pending-actions-wrapper,.suggested-actions-wrapper{overflow-y:auto;height:calc(100vh - 150px)}\n"], dependencies: [{ 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: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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.PaginationControlsComponent, selector: "pagination-controls", inputs: ["id", "maxSize", "directionLinks", "autoHide", "responsive", "previousLabel", "nextLabel", "screenReaderPaginationLabel", "screenReaderPageLabel", "screenReaderCurrentLabel"], outputs: ["pageChange", "pageBoundsCorrection"] }, { kind: "directive", type: i5.LazyImgDirective, selector: "img" }, { kind: "directive", type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i7.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i8.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i9.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i10.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.PaginatePipe, name: "paginate" }, { kind: "pipe", type: i11.TranslocoPipe, name: "transloco" }] }); }
251
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: CrmActionsComponent, selector: "pw-crm-actions", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 mb-4\">\n <div class=\"col-12 mb-0\">\n <h2>{{ 'Crm.Actions.Title' | transloco }}</h2>\n </div>\n <div class=\"col-12 col-sm-3 float-start mb-2\"\n *ngIf=\"showFilter\">\n <select class=\"form-select\"\n (change)=\"filterByUser($event)\">\n <option value=\"0\">Filter by user</option>\n <option *ngFor=\"let member of allSubscriptionMembers\"\n [value]=\"member.id\">\n {{ member.first_name }} {{ member.last_name }}\n </option>\n </select>\n </div>\n <div>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n data-cy=\"add-opportunities\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end me-3\"\n data-cy=\"add-contact\"\n [routerLink]=\"['/' + subscription?.slug + routers.addAccount]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.AccountMessage.AddAccount' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end me-3\"\n [routerLink]=\"['/' + subscription?.slug + routers.contactAdd]\"\n data-cy=\"add-action\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.AddContact' | transloco }}\n </a>\n </div>\n </div>\n <!-- Pending Actions -->\n <div class=\"col-12 col-md-6 mb-3\">\n <h5 class=\"accordion-heading\">Pending Actions</h5>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"contactActions?.length === 0 && isLoaded\"\n class=\"px-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Actions.ActionMessage' | transloco\"> </pw-no-data>\n </div>\n <!-- wrapper for infinite scroll -->\n <div #selector class=\"pending-actions-wrapper\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [infiniteScrollContainer]=\"selector\"\n [fromRoot]=\"true\"\n (scrolled)=\"onScrollPendingActions()\">\n <div class=\"mb-4 action-card bg-white\"\n *ngFor=\"let action of contactActions; let i = index\">\n <div class=\"p-2\">\n <ul class=\"list-inline\">\n <li class=\"list-inline-item me-2\">\n <h6 *ngIf=\"!updating || actionId !== action.id\">\n {{ action.when_short_date }}\n </h6>\n <input *ngIf=\"updating && actionId === action.id\"\n placeholder=\"dd-mmm-yyyy\"\n [value]=\"action.when_short_date\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, action)\" />\n </li>\n <li>\n <button type=\"button\"\n class=\"btn btn-sm when-btn\"\n (click)=\"showDatePicker(action?.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n ngbTooltip=\"Click to Edit\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </li>\n <li class=\"list-inline-item\">\n <span class=\"badge bg-primary\">{{ action.crm_action?.name }}</span>\n </li>\n <li>\n <ng-container *ngIf=\"action.owner?.user_avatar?.length > 0; else noProfileImg\">\n <ng-container *ngFor=\"let owner_image of action.owner?.user_avatar\">\n <div class=\"text-center my-2\" *ngIf=\"owner_image.width === 50\" [ngbTooltip]=\"action.owner.first_name + ' ' +action.owner.last_name\">\n <div class=\"avatar avatar-image\">\n <img\n class=\"img-fluid\"\n [src]=\"owner_image.url\"\n alt=\"Male Icon\"\n (error)=\"handleImageError($event, 'assets/img/icons/male.png')\"\n />\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #noProfileImg>\n <div class=\"text-center my-2\">\n <div class=\"avatar avatar-image\">\n <img\n src=\"/assets/img/icons/male.png\"\n alt=\"\"\n class=\"img-fluid\"\n />\n </div>\n </div>\n </ng-template>\n </li>\n\n <li class=\"list-inline-item float-end\">\n <a *ngIf=\"action?.crm_contact\"\n ngbTooltip=\"See this contact\"\n aria-label=\"See this contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n action?.crm_contact?.id\n ]\">\n <i class=\"fa fa-eye me-3 see-icon\" aria-hidden=\"true\"></i>\n </a>\n <a ngbTooltip=\"Set as completed\"\n aria-label=\"Set as completed\"\n class=\"me-3\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCompleted(action.id, action, i)\">\n <i class=\"fa fa-tasks cta1-icon\" aria-hidden=\"true\"></i>\n </a>\n <a ngbTooltip=\"Set as cancelled\"\n aria-label=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(action.id, action, i)\">\n <i\n class=\"fa fa-times text-danger delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n </li>\n </ul>\n <p [class.text-danger]=\"!action.color\"\n class=\"mb-0\"\n *ngIf=\"action.due\">\n {{ action.due }}\n </p>\n <p *ngIf=\"action.owner?.id !== userId\"\n class=\"m-0 mt-1\">\n <a class=\"font-italic grey\"\n [routerLink]=\"['/members', action?.owner?.slug]\">Added by\n {{ action.owner?.first_name + ' ' + action.owner?.last_name }}</a>\n </p>\n <p class=\"mt-1 mb-1 fw-bold\">\n <a class=\"text-secondary\"\n *ngIf=\"action?.crm_contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n action?.crm_contact?.id\n ]\">\n {{\n action?.crm_contact?.first_name +\n ' ' +\n action?.crm_contact?.last_name\n }}\n </a>\n <a *ngIf=\"!action.crm_contact_id\">N/A</a> at\n <a *ngIf=\"action.crm_account_id\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n action?.crm_account?.id\n ]\">\n {{ action?.crm_account?.name }}\n </a>\n </p>\n <div class=\"comment-section\">\n <textarea class=\"mt-1 textarea form-control mb-2\"\n [(ngModel)]=\"action.comment\">{{ action.comment }}</textarea>\n <div class=\"d-flex\">\n <p class=\"my-1 comment\"\n *ngIf=\"!showFullComment || action.id !== commentId\">\n {{ action.comment | slice: 0:230\n }}<a *ngIf=\"action.comment.length > 230\"\n class=\"text-secondary\"\n (click)=\"showFullComment = true; commentId = action.id\">...show more\n </a>\n </p>\n <p class=\"my-1 comment\"\n *ngIf=\"showFullComment && action.id === commentId\">\n {{ action.comment }}\n <a *ngIf=\"action.comment.length > 230 && showFullComment\"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn\"\n (click)=\"editComment($event)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"control-btns edit-control-btns\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"editComment(undefined)\">\n {{ 'Button.Cancel' | transloco }}\n </button>\n <button class=\"btn btn-sm btn-primary\"\n (click)=\"updateComment(action)\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Suggested Actions -->\n <div class=\"col-12 col-md-6 mb-3\">\n <h5 class=\"accordion-heading\">AI Suggested Actions</h5>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n\n\n <div #suggestedActionsSelector *ngIf=\"accountActionSuggested?.length > 0\" class=\"suggested-actions-wrapper\"\n infiniteScroll\n [infiniteScrollContainer]=\"suggestedActionsSelector\"\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\">\n\n <div class=\"mb-4 action-card bg-white\"\n *ngFor=\"\n let suggestedAction of accountActionSuggested\n | paginate: { id: 'suggestedAction', itemsPerPage: 10, currentPage: p1 };\n let i = index\n \">\n <div class=\"p-2\">\n <p class=\"mt-1 mb-1 fw-bold\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n suggestedAction?.crm_account?.id\n ]\">{{ suggestedAction?.crm_account?.name }}</a>\n </p>\n <p class=\"fw-bold mb-1\">{{ suggestedAction.crm_action }}</p>\n <p class=\"mb-0\">{{ suggestedAction.reason }}</p>\n </div>\n </div>\n </div>\n <div class=\"text-center pagination-controls w-100 mt-3\"\n *ngIf=\"accountActionSuggested?.length < 10\">\n <pagination-controls id=\"suggestedAction\"\n (pageChange)=\"p1 = $event\">\n </pagination-controls>\n </div>\n <div *ngIf=\"accountActionSuggested.length === 0 && isLoadedSuggested\"\n class=\"px-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Actions.ActionSuggestionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n</div>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.textarea,.control-btns{display:none}.comment,.edit-btn{display:block}.comment{border:0;border-bottom:1px solid rgb(242,242,242);color:#000;font-size:1rem;resize:none}.textarea{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:17px}.comment-section{min-width:350px;padding-right:45px;position:relative}.comment-section p{word-break:break-all}.comment-section.show-controls .textarea,.comment-section.show-controls .control-btns{display:block}.comment-section.show-controls .comment,.comment-section.show-controls .edit-btn{display:none}.comment-section.show-controls .control-btns.edit-control-btns{display:flex;justify-content:flex-end}.edit-btn{margin-top:-15px}.avatar-image{height:25px;width:25px}.when-btn:focus{border:0;box-shadow:none}.pending-actions-wrapper,.suggested-actions-wrapper{overflow-y:auto;height:calc(100vh - 150px)}\n"], dependencies: [{ 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: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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.PaginationControlsComponent, selector: "pagination-controls", inputs: ["id", "maxSize", "directionLinks", "autoHide", "responsive", "previousLabel", "nextLabel", "screenReaderPaginationLabel", "screenReaderPageLabel", "screenReaderCurrentLabel"], outputs: ["pageChange", "pageBoundsCorrection"] }, { kind: "directive", type: i5.LazyImgDirective, selector: "img" }, { kind: "directive", type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i7.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i8.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i9.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i10.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.PaginatePipe, name: "paginate" }, { kind: "pipe", type: i11.TranslocoPipe, name: "transloco" }] }); }
252
252
  }
253
253
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: CrmActionsComponent, decorators: [{
254
254
  type: Component,
255
- args: [{ selector: 'pw-crm-actions', template: "<div class=\"row\">\n <div class=\"col-12 mb-4\">\n <div class=\"col-12 mb-0\">\n <h2>{{ 'Crm.Actions.Title' | transloco }}</h2>\n </div>\n <div class=\"col-12 col-sm-3 float-start mb-2\"\n *ngIf=\"showFilter\">\n <select class=\"form-select\"\n (change)=\"filterByUser($event)\">\n <option value=\"0\">Filter by user</option>\n <option *ngFor=\"let member of allSubscriptionMembers\"\n [value]=\"member.id\">\n {{ member.first_name }} {{ member.last_name }}\n </option>\n </select>\n </div>\n <div>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n data-cy=\"add-opportunities\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end me-3\"\n data-cy=\"add-contact\"\n [routerLink]=\"['/' + subscription?.slug + routers.addAccount]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.AccountMessage.AddAccount' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end me-3\"\n [routerLink]=\"['/' + subscription?.slug + routers.contactAdd]\"\n data-cy=\"add-action\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.AddContact' | transloco }}\n </a>\n </div>\n </div>\n <!-- Pending Actions -->\n <div class=\"col-12 col-md-6 mb-3\">\n <h5 class=\"accordion-heading\">Pending Actions</h5>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"contactActions?.length === 0 && isLoaded\"\n class=\"px-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Actions.ActionMessage' | transloco\"> </pw-no-data>\n </div>\n <!-- wrapper for infinite scroll -->\n <div #selector class=\"pending-actions-wrapper\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [infiniteScrollContainer]=\"selector\"\n [fromRoot]=\"true\"\n (scrolled)=\"onScrollPendingActions()\">\n <div class=\"mb-4 action-card bg-white\"\n *ngFor=\"let action of contactActions; let i = index\">\n <div class=\"p-2\">\n <ul class=\"list-inline\">\n <li class=\"list-inline-item me-2\">\n <h6 *ngIf=\"!updating || actionId !== action.id\">\n {{ action.when_short_date }}\n </h6>\n <input *ngIf=\"updating && actionId === action.id\"\n placeholder=\"dd-mmm-yyyy\"\n [value]=\"action.when_short_date\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, action)\" />\n </li>\n <li>\n <button type=\"button\"\n class=\"btn btn-sm when-btn\"\n (click)=\"showDatePicker(action?.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n ngbTooltip=\"Click to Edit\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </li>\n <li class=\"list-inline-item\">\n <span class=\"badge bg-primary\">{{ action.crm_action?.name }}</span>\n </li>\n <li>\n <ng-container *ngIf=\"action.owner?.user_avatar?.length > 0; else noProfileImg\">\n <ng-container *ngFor=\"let owner_image of action.owner?.user_avatar\">\n <div class=\"text-center my-2\" *ngIf=\"owner_image.width === 50\" [ngbTooltip]=\"action.owner.first_name + ' ' +action.owner.last_name\">\n <div class=\"avatar avatar-image\">\n <img\n class=\"img-fluid\"\n [src]=\"owner_image.url\"\n alt=\"Male Icon\"\n (error)=\"handleImageError($event, 'assets/img/icons/male.png')\"\n />\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #noProfileImg>\n <div class=\"text-center my-2\">\n <div class=\"avatar avatar-image\">\n <img\n src=\"/assets/img/icons/male.png\"\n alt=\"\"\n class=\"img-fluid\"\n />\n </div>\n </div>\n </ng-template>\n </li>\n\n <li class=\"list-inline-item float-end\">\n <a *ngIf=\"action?.crm_contact\"\n ngbTooltip=\"See this contact\"\n aria-label=\"See this contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n action?.crm_contact?.id\n ]\">\n <i class=\"fa fa-eye me-3 see-icon\" aria-hidden=\"true\"></i>\n </a>\n <a ngbTooltip=\"Set as completed\"\n aria-label=\"Set as completed\"\n class=\"me-3\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCompleted(action.id, action, i)\">\n <i class=\"fa fa-tasks cta1-icon\" aria-hidden=\"true\"></i>\n </a>\n <a ngbTooltip=\"Set as cancelled\"\n aria-label=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(action.id, action, i)\">\n <i\n class=\"fa fa-times text-danger delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n </li>\n </ul>\n <p [class.text-danger]=\"!action.color\"\n class=\"mb-0\"\n *ngIf=\"action.due\">\n {{ action.due }}\n </p>\n <p *ngIf=\"action.owner?.id !== userId\"\n class=\"m-0 mt-1\">\n <a class=\"font-italic grey\"\n [routerLink]=\"['/members', action?.owner?.slug]\">Added by\n {{ action.owner?.first_name + ' ' + action.owner?.last_name }}</a>\n </p>\n <p class=\"mt-1 mb-1 fw-bold\">\n <a class=\"text-secondary\"\n *ngIf=\"action?.crm_contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n action?.crm_contact?.id\n ]\">\n {{\n action?.crm_contact?.first_name +\n ' ' +\n action?.crm_contact?.last_name\n }}\n </a>\n <a *ngIf=\"!action.crm_contact_id\">N/A</a> at\n <a *ngIf=\"action.crm_account_id\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n action?.crm_account?.id\n ]\">\n {{ action?.crm_account?.name }}\n </a>\n </p>\n <div class=\"comment-section\">\n <textarea class=\"mt-1 textarea form-control mb-2\"\n [(ngModel)]=\"action.comment\">{{ action.comment }}</textarea>\n <div class=\"d-flex\">\n <p class=\"my-1 comment\"\n *ngIf=\"!showFullComment || action.id !== commentId\">\n {{ action.comment | slice: 0:230\n }}<a *ngIf=\"action.comment.length > 230\"\n class=\"text-secondary\"\n (click)=\"showFullComment = true; commentId = action.id\">...show more\n </a>\n </p>\n <p class=\"my-1 comment\"\n *ngIf=\"showFullComment && action.id === commentId\">\n {{ action.comment }}\n <a *ngIf=\"action.comment.length > 230 && showFullComment\"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn\"\n (click)=\"editComment($event)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"control-btns edit-control-btns\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"editComment(undefined)\">\n {{ 'Button.Cancel' | transloco }}\n </button>\n <button class=\"btn btn-sm btn-primary\"\n (click)=\"updateComment(action)\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Suggested Actions -->\n <div class=\"col-12 col-md-6 mb-3\">\n <h5 class=\"accordion-heading\">AI Suggested Actions</h5>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n\n\n <div #suggestedActionsSelector *ngIf=\"accountActionSuggested?.length > 0\" class=\"suggested-actions-wrapper\"\n infiniteScroll\n [infiniteScrollContainer]=\"suggestedActionsSelector\"\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\">\n\n <div class=\"mb-4 action-card bg-white\"\n *ngFor=\"\n let suggestedAction of accountActionSuggested\n | paginate: { id: 'suggestedAction', itemsPerPage: 10, currentPage: p1 };\n let i = index\n \">\n <div class=\"p-2\">\n <p class=\"mt-1 mb-1 fw-bold\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n suggestedAction?.crm_account?.id\n ]\">{{ suggestedAction?.crm_account?.name }}</a>\n </p>\n <p class=\"fw-bold mb-1\">{{ suggestedAction.crm_action }}</p>\n <p class=\"mb-0\">{{ suggestedAction.reason }}</p>\n </div>\n </div>\n </div>\n <div class=\"text-center pagination-controls w-100 mt-3\"\n *ngIf=\"accountActionSuggested?.length > 10\">\n <pagination-controls id=\"suggestedAction\"\n (pageChange)=\"p1 = $event\">\n </pagination-controls>\n </div>\n <div *ngIf=\"accountActionSuggested.length === 0 && isLoadedSuggested\"\n class=\"px-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Actions.ActionSuggestionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n</div>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.textarea,.control-btns{display:none}.comment,.edit-btn{display:block}.comment{border:0;border-bottom:1px solid rgb(242,242,242);color:#000;font-size:1rem;resize:none}.textarea{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:17px}.comment-section{min-width:350px;padding-right:45px;position:relative}.comment-section p{word-break:break-all}.comment-section.show-controls .textarea,.comment-section.show-controls .control-btns{display:block}.comment-section.show-controls .comment,.comment-section.show-controls .edit-btn{display:none}.comment-section.show-controls .control-btns.edit-control-btns{display:flex;justify-content:flex-end}.edit-btn{margin-top:-15px}.avatar-image{height:25px;width:25px}.when-btn:focus{border:0;box-shadow:none}.pending-actions-wrapper,.suggested-actions-wrapper{overflow-y:auto;height:calc(100vh - 150px)}\n"] }]
255
+ args: [{ selector: 'pw-crm-actions', template: "<div class=\"row\">\n <div class=\"col-12 mb-4\">\n <div class=\"col-12 mb-0\">\n <h2>{{ 'Crm.Actions.Title' | transloco }}</h2>\n </div>\n <div class=\"col-12 col-sm-3 float-start mb-2\"\n *ngIf=\"showFilter\">\n <select class=\"form-select\"\n (change)=\"filterByUser($event)\">\n <option value=\"0\">Filter by user</option>\n <option *ngFor=\"let member of allSubscriptionMembers\"\n [value]=\"member.id\">\n {{ member.first_name }} {{ member.last_name }}\n </option>\n </select>\n </div>\n <div>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n data-cy=\"add-opportunities\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end me-3\"\n data-cy=\"add-contact\"\n [routerLink]=\"['/' + subscription?.slug + routers.addAccount]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.AccountMessage.AddAccount' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end me-3\"\n [routerLink]=\"['/' + subscription?.slug + routers.contactAdd]\"\n data-cy=\"add-action\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.AddContact' | transloco }}\n </a>\n </div>\n </div>\n <!-- Pending Actions -->\n <div class=\"col-12 col-md-6 mb-3\">\n <h5 class=\"accordion-heading\">Pending Actions</h5>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"contactActions?.length === 0 && isLoaded\"\n class=\"px-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Actions.ActionMessage' | transloco\"> </pw-no-data>\n </div>\n <!-- wrapper for infinite scroll -->\n <div #selector class=\"pending-actions-wrapper\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [infiniteScrollContainer]=\"selector\"\n [fromRoot]=\"true\"\n (scrolled)=\"onScrollPendingActions()\">\n <div class=\"mb-4 action-card bg-white\"\n *ngFor=\"let action of contactActions; let i = index\">\n <div class=\"p-2\">\n <ul class=\"list-inline\">\n <li class=\"list-inline-item me-2\">\n <h6 *ngIf=\"!updating || actionId !== action.id\">\n {{ action.when_short_date }}\n </h6>\n <input *ngIf=\"updating && actionId === action.id\"\n placeholder=\"dd-mmm-yyyy\"\n [value]=\"action.when_short_date\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, action)\" />\n </li>\n <li>\n <button type=\"button\"\n class=\"btn btn-sm when-btn\"\n (click)=\"showDatePicker(action?.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n ngbTooltip=\"Click to Edit\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </li>\n <li class=\"list-inline-item\">\n <span class=\"badge bg-primary\">{{ action.crm_action?.name }}</span>\n </li>\n <li>\n <ng-container *ngIf=\"action.owner?.user_avatar?.length > 0; else noProfileImg\">\n <ng-container *ngFor=\"let owner_image of action.owner?.user_avatar\">\n <div class=\"text-center my-2\" *ngIf=\"owner_image.width === 50\" [ngbTooltip]=\"action.owner.first_name + ' ' +action.owner.last_name\">\n <div class=\"avatar avatar-image\">\n <img\n class=\"img-fluid\"\n [src]=\"owner_image.url\"\n alt=\"Male Icon\"\n (error)=\"handleImageError($event, 'assets/img/icons/male.png')\"\n />\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #noProfileImg>\n <div class=\"text-center my-2\">\n <div class=\"avatar avatar-image\">\n <img\n src=\"/assets/img/icons/male.png\"\n alt=\"\"\n class=\"img-fluid\"\n />\n </div>\n </div>\n </ng-template>\n </li>\n\n <li class=\"list-inline-item float-end\">\n <a *ngIf=\"action?.crm_contact\"\n ngbTooltip=\"See this contact\"\n aria-label=\"See this contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n action?.crm_contact?.id\n ]\">\n <i class=\"fa fa-eye me-3 see-icon\" aria-hidden=\"true\"></i>\n </a>\n <a ngbTooltip=\"Set as completed\"\n aria-label=\"Set as completed\"\n class=\"me-3\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCompleted(action.id, action, i)\">\n <i class=\"fa fa-tasks cta1-icon\" aria-hidden=\"true\"></i>\n </a>\n <a ngbTooltip=\"Set as cancelled\"\n aria-label=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(action.id, action, i)\">\n <i\n class=\"fa fa-times text-danger delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n </li>\n </ul>\n <p [class.text-danger]=\"!action.color\"\n class=\"mb-0\"\n *ngIf=\"action.due\">\n {{ action.due }}\n </p>\n <p *ngIf=\"action.owner?.id !== userId\"\n class=\"m-0 mt-1\">\n <a class=\"font-italic grey\"\n [routerLink]=\"['/members', action?.owner?.slug]\">Added by\n {{ action.owner?.first_name + ' ' + action.owner?.last_name }}</a>\n </p>\n <p class=\"mt-1 mb-1 fw-bold\">\n <a class=\"text-secondary\"\n *ngIf=\"action?.crm_contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n action?.crm_contact?.id\n ]\">\n {{\n action?.crm_contact?.first_name +\n ' ' +\n action?.crm_contact?.last_name\n }}\n </a>\n <a *ngIf=\"!action.crm_contact_id\">N/A</a> at\n <a *ngIf=\"action.crm_account_id\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n action?.crm_account?.id\n ]\">\n {{ action?.crm_account?.name }}\n </a>\n </p>\n <div class=\"comment-section\">\n <textarea class=\"mt-1 textarea form-control mb-2\"\n [(ngModel)]=\"action.comment\">{{ action.comment }}</textarea>\n <div class=\"d-flex\">\n <p class=\"my-1 comment\"\n *ngIf=\"!showFullComment || action.id !== commentId\">\n {{ action.comment | slice: 0:230\n }}<a *ngIf=\"action.comment.length > 230\"\n class=\"text-secondary\"\n (click)=\"showFullComment = true; commentId = action.id\">...show more\n </a>\n </p>\n <p class=\"my-1 comment\"\n *ngIf=\"showFullComment && action.id === commentId\">\n {{ action.comment }}\n <a *ngIf=\"action.comment.length > 230 && showFullComment\"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn\"\n (click)=\"editComment($event)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"control-btns edit-control-btns\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"editComment(undefined)\">\n {{ 'Button.Cancel' | transloco }}\n </button>\n <button class=\"btn btn-sm btn-primary\"\n (click)=\"updateComment(action)\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Suggested Actions -->\n <div class=\"col-12 col-md-6 mb-3\">\n <h5 class=\"accordion-heading\">AI Suggested Actions</h5>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n\n\n <div #suggestedActionsSelector *ngIf=\"accountActionSuggested?.length > 0\" class=\"suggested-actions-wrapper\"\n infiniteScroll\n [infiniteScrollContainer]=\"suggestedActionsSelector\"\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\">\n\n <div class=\"mb-4 action-card bg-white\"\n *ngFor=\"\n let suggestedAction of accountActionSuggested\n | paginate: { id: 'suggestedAction', itemsPerPage: 10, currentPage: p1 };\n let i = index\n \">\n <div class=\"p-2\">\n <p class=\"mt-1 mb-1 fw-bold\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n suggestedAction?.crm_account?.id\n ]\">{{ suggestedAction?.crm_account?.name }}</a>\n </p>\n <p class=\"fw-bold mb-1\">{{ suggestedAction.crm_action }}</p>\n <p class=\"mb-0\">{{ suggestedAction.reason }}</p>\n </div>\n </div>\n </div>\n <div class=\"text-center pagination-controls w-100 mt-3\"\n *ngIf=\"accountActionSuggested?.length < 10\">\n <pagination-controls id=\"suggestedAction\"\n (pageChange)=\"p1 = $event\">\n </pagination-controls>\n </div>\n <div *ngIf=\"accountActionSuggested.length === 0 && isLoadedSuggested\"\n class=\"px-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Actions.ActionSuggestionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n</div>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.textarea,.control-btns{display:none}.comment,.edit-btn{display:block}.comment{border:0;border-bottom:1px solid rgb(242,242,242);color:#000;font-size:1rem;resize:none}.textarea{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:17px}.comment-section{min-width:350px;padding-right:45px;position:relative}.comment-section p{word-break:break-all}.comment-section.show-controls .textarea,.comment-section.show-controls .control-btns{display:block}.comment-section.show-controls .comment,.comment-section.show-controls .edit-btn{display:none}.comment-section.show-controls .control-btns.edit-control-btns{display:flex;justify-content:flex-end}.edit-btn{margin-top:-15px}.avatar-image{height:25px;width:25px}.when-btn:focus{border:0;box-shadow:none}.pending-actions-wrapper,.suggested-actions-wrapper{overflow-y:auto;height:calc(100vh - 150px)}\n"] }]
256
256
  }], ctorParameters: () => [{ type: i1.CrmService }, { type: i0.Injector }, { type: Document, decorators: [{
257
257
  type: Inject,
258
258
  args: [DOCUMENT]
259
259
  }] }] });
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLWFjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLWFjdGlvbnMvc21hcnQtY3JtLWFjdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLWFjdGlvbnMvc21hcnQtY3JtLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RCxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUUvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFPMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGdCQUFnQjtJQStCckQsWUFDcUIsVUFBc0IsRUFDdkMsUUFBa0IsRUFDaUIsUUFBa0I7UUFFckQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSkMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUVKLGFBQVEsR0FBUixRQUFRLENBQVU7UUFqQ2pELHdCQUFtQixHQUFH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c0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgc3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XG5cbmltcG9ydCB7IFJPVVRFUlMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcm91dGVycy9yb3V0ZXJzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwdy1jcm0tYWN0aW9ucycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWNybS1hY3Rpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zbWFydC1jcm0tYWN0aW9ucy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENybUFjdGlvbnNDb21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgdG90YWxQZW5kaW5nQWN0aW9ucyA9IDA7XG5cbiAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnRhY3RJZDogbnVtYmVyO1xuICAgIHVzZXJJZDogbnVtYmVyO1xuICAgIGFjdGlvbklkOiBudW1iZXI7XG4gICAgY29tbWVudElkOiBudW1iZXI7XG5cbiAgICBwOiBudW1iZXI7XG4gICAgcDE6IG51bWJlcjtcbiAgICBjdXJyZW50UGFnZSA9IDE7XG5cbiAgICBjb250YWN0QWN0aW9ucyA9IFtdO1xuICAgIGNvbnRhY3RBY3Rpb25zQWxsID0gW107XG4gICAgYWNjb3VudEFjdGlvblN1Z2dlc3RlZCA9IFtdO1xuICAgIGFsbFN1YnNjcmlwdGlvbk1lbWJlcnM6IHN0cmluZ1tdO1xuXG4gICAgc2VsZWN0b3IgPSAnLnBlbmRpbmctYWN0aW9ucy13cmFwcGVyJztcbiAgICBzdWdnZXN0ZWRBY3Rpb25zU2VsZWN0b3IgPSAnLnN1Z2dlc3RlZC1hY3Rpb25zLXdyYXBwZXInO1xuXG4gICAgaXNMb2FkZWQgPSBmYWxzZTtcbiAgICBpc0xvYWRlZFN1Z2dlc3RlZCA9IGZhbHNlO1xuICAgIHNob3dGdWxsQ29tbWVudCA9IGZhbHNlO1xuICAgIHNob3dGaWx0ZXIgPSBmYWxzZTtcbiAgICB1cGRhdGluZyA9IGZhbHNlO1xuICAgIGRhbmdlckNvbG9yOiBib29sZWFuO1xuXG4gICAgcm91dGVycyA9IFJPVVRFUlM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjcm1TZXJ2aWNlOiBDcm1TZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50QWN0aW9ucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEFjdGlvblN1Z2dlc3RlZCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51c2VyU3RvcmUoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHJlcy5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25TY3JvbGxQZW5kaW5nQWN0aW9ucygpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSsrO1xuICAgICAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWxQZW5kaW5nQWN0aW9ucyAvIDUpO1xuICAgICAgICAvLyBQcmV2ZW50IEFQSSBjYWxsIGlmIGFsbCByZWNvcmRzIGhhdmUgYmVlbiBmZXRjaGVkXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlIDw9IHRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEFjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYWxsIGFjdGlvbnMgKi9cbiAgICBwcml2YXRlIGdldEFjY291bnRBY3Rpb25zKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRBY2NvdW50QWN0aW9ucyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIHsgcGFnZTogdGhpcy5jdXJyZW50UGFnZSwgcGFnZV9zaXplOiAxMCB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2U/LmNybV9hY2NvdW50X2FjdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3RhbFBlbmRpbmdBY3Rpb25zID0gcmVzcG9uc2U/Lm9iamVjdF9jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEFjdGlvbnNBbGwgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5jb250YWN0QWN0aW9uc0FsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXNwb25zZS5jcm1fYWNjb3VudF9hY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0QWN0aW9uc0FsbCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi51bmlxQnkodGhpcy5jb250YWN0QWN0aW9uc0FsbC50b1JldmVyc2VkKCksICdpZCcpLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEFjdGlvbnNBbGwuZm9yRWFjaChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLndoZW5fc2hvcnRfZGF0ZSA9IG1vbWVudChkYXRhLndoZW4pLmZvcm1hdCgnREQtTU1NLVlZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gbW9tZW50KG5ldyBEYXRlKGRhdGEud2hlbikpLmRpZmYoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudChuZXcgRGF0ZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RheXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9tZW50KG5ldyBEYXRlKGRhdGEud2hlbikpIDwgbW9tZW50KG5ldyBEYXRlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2R1ZSddID0gYE92ZXJkdWUgYnkgJHtNYXRoLmFicyhkaWZmKX0gZGF5c2A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2NvbG9yJ10gPSB0aGlzLmRhbmdlckNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2R1ZSddID0gYEluICR7ZGlmZn0gZGF5c2A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2NvbG9yJ10gPSAhdGhpcy5kYW5nZXJDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEFjdGlvbnNBbGwuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShhLndoZW4pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIud2hlbikuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RBY3Rpb25zID0gWy4uLnRoaXMuY29udGFjdEFjdGlvbnNBbGxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxTdWJzY3JpcHRpb25NZW1iZXJzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lck9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0QWN0aW9uc0FsbC5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGRhdGEub3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJPYmplY3RbaWRdID0gZGF0YS5vd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMob3duZXJPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxTdWJzY3JpcHRpb25NZW1iZXJzLnB1c2gob3duZXJPYmplY3RbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RmlsdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hbGxTdWJzY3JpcHRpb25NZW1iZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dGaWx0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW1hZ2VFcnJvcihldmVudDogRXZlbnQsIGZhbGxiYWNrUGF0aCk6IHZvaWQge1xuICAgICAgICBIZWxwZXJTZXJ2aWNlLmhhbmRsZUltYWdlRmFsbGJhY2tQYXRoKGV2ZW50LCBmYWxsYmFja1BhdGgpO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYWNjb3VudCBhY3Rpb24gc3VnZ2VzdGVkICovXG4gICAgcHJpdmF0ZSBnZXRBY2NvdW50QWN0aW9uU3VnZ2VzdGVkKHN1YnNjcmlwdGlvbl9pZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldEFjY291bnRBY3Rpb25TdWdnZXN0ZWQoc3Vic2NyaXB0aW9uX2lkKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50QWN0aW9uU3VnZ2VzdGVkID0gcmVzcG9uc2U/LmNybV9hY2NvdW50X2FjdGlvbnMgfHwgW107XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZFN1Z2dlc3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlZGl0Q29tbWVudChldmVudCkge1xuICAgICAgICBjb25zdCBjb21tZW50cyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgICAgICdjb21tZW50LXNlY3Rpb24nXG4gICAgICAgICkgYXMgSFRNTENvbGxlY3Rpb25PZjxFbGVtZW50PiAmIEl0ZXJhYmxlPEVsZW1lbnQ+O1xuICAgICAgICBpZiAoZXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuY29tbWVudC1zZWN0aW9uJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93LWNvbnRyb2xzJykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbW1lbnQgb2YgY29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93LWNvbnRyb2xzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdCgnLmNvbW1lbnQtc2VjdGlvbicpLmNsYXNzTGlzdC5hZGQoJ3Nob3ctY29udHJvbHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBjb21tZW50cykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdy1jb250cm9scycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYoZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5jb21tZW50LXNlY3Rpb24nKS5jbGFzc0xpc3QuZmluZCgpKVxuICAgIH1cblxuICAgIHVwZGF0ZUNvbW1lbnQoYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbW1lbnRPYmogPSB7XG4gICAgICAgICAgICBjb21tZW50OiBhY3Rpb24uY29tbWVudCxcbiAgICAgICAgICAgIGNvbXBsZXRlZDogYWN0aW9uLmNvbXBsZXRlZCxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogYWN0aW9uLmNhbmNlbGxlZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGFjdGlvbi5pZCwgY29tbWVudE9iailcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnY29tbWVudCB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvbW1lbnQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFjY291bnRBY3Rpb25zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2V0IHRoZSBhY3Rpb24gYXMgY29tcGxldGVkICovXG4gICAgc2V0QXNDb21wbGV0ZWQoaWQ6IG51bWJlciwgYWN0aW9uLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBzd2FsXG4gICAgICAgICAgICAuZmlyZSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIGh0bWw6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2V0IGFzIENvbXBsZXRlZD9gLFxuICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3dhcm5pbmcnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbk9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGFjdGlvbi5jb21tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkOiBhY3Rpb24uY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RBY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2V0IHRoZSBhY3Rpb24gYXMgY2FuY2VsbGVkICovXG4gICAgc2V0QXNDYW5jZWxsZWQoaWQ6IG51bWJlciwgYWN0aW9uLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBzd2FsXG4gICAgICAgICAgICAuZmlyZSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDYW5jZWwnLFxuICAgICAgICAgICAgICAgIGh0bWw6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2V0IGFzIGNhbmNlbGxlZD9gLFxuICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3dhcm5pbmcnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbk9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGFjdGlvbi5jb21tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkOiBhY3Rpb24uY29tcGxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RBY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2hvdyBEYXRlUGlja2VyICovXG4gICAgc2hvd0RhdGVQaWNrZXIoYWN0aW9uSWQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnVwZGF0aW5nID0gIXRoaXMudXBkYXRpbmc7XG4gICAgICAgIHRoaXMuYWN0aW9uSWQgPSBhY3Rpb25JZDtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBkYXRlICovXG4gICAgb25EYXRlU2VsZWN0KGV2ZW50LCBhY3Rpb24pIHtcbiAgICAgICAgY29uc3QgY29tbWVudE9iaiA9IHtcbiAgICAgICAgICAgIHdoZW46IEhlbHBlclNlcnZpY2UuZGF0ZUZvcm1hdChldmVudCksXG4gICAgICAgICAgICBjb21tZW50OiBhY3Rpb24uY29tbWVudCxcbiAgICAgICAgICAgIGNvbXBsZXRlZDogYWN0aW9uLmNvbXBsZXRlZCxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogYWN0aW9uLmNhbmNlbGxlZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGFjdGlvbi5pZCwgY29tbWVudE9iailcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnZGF0ZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEFjdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZmlsdGVyIHRoZSBkYXRhIGJ5IHVzZXIgKi9cbiAgICBmaWx0ZXJCeVVzZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICBpZiAodXNlcklkICE9PSAnMCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuY29udGFjdEFjdGlvbnNBbGwuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGFjdGlvbiA9PiBhY3Rpb24ub3duZXJfaWQgPT09IE51bWJlcih1c2VySWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb250YWN0QWN0aW9ucyA9IGZpbHRlcmVkRGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFjdEFjdGlvbnMgPSB0aGlzLmNvbnRhY3RBY3Rpb25zQWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTBcIj5cbiAgICAgIDxoMj57eyAnQ3JtLkFjdGlvbnMuVGl0bGUnIHwgdHJhbnNsb2NvIH19PC9oMj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zIGZsb2F0LXN0YXJ0IG1iLTJcIlxuICAgICAgKm5nSWY9XCJzaG93RmlsdGVyXCI+XG4gICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxuICAgICAgICAoY2hhbmdlKT1cImZpbHRlckJ5VXNlcigkZXZlbnQpXCI+XG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCIwXCI+RmlsdGVyIGJ5IHVzZXI8L29wdGlvbj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbWVtYmVyIG9mIGFsbFN1YnNjcmlwdGlvbk1lbWJlcnNcIlxuICAgICAgICAgIFt2YWx1ZV09XCJtZW1iZXIuaWRcIj5cbiAgICAgICAgICB7eyBtZW1iZXIuZmlyc3RfbmFtZSB9fSB7eyBtZW1iZXIubGFzdF9uYW1lIH19XG4gICAgICAgIDwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IGZsb2F0LWVuZFwiXG4gICAgZGF0YS1jeT1cImFkZC1vcHBvcnR1bml0aWVzXCJcbiAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5vcHBvcnR1bml0eUFkZF1cIj5cbiAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQWRkT3Bwb3J0dW5pdHknIHwgdHJhbnNsb2NvIH19XG4gICAgPC9hPlxuICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgZmxvYXQtZW5kIG1lLTNcIlxuICAgICAgICBkYXRhLWN5PVwiYWRkLWNvbnRhY3RcIlxuICAgICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5hZGRBY2NvdW50XVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICB7eyAnQ3JtLkFjY291bnRNZXNzYWdlLkFkZEFjY291bnQnIHwgdHJhbnNsb2NvIH19XG4gICAgICA8L2E+XG4gICAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmQgbWUtM1wiXG4gICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0QWRkXVwiXG4gICAgICBkYXRhLWN5PVwiYWRkLWFjdGlvblwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuQWRkQ29udGFjdCcgfCB0cmFuc2xvY28gfX1cbiAgICA8L2E+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8IS0tIFBlbmRpbmcgQWN0aW9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zXCI+XG4gICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5QZW5kaW5nIEFjdGlvbnM8L2g1PlxuICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCJcbiAgICAgICpuZ0lmPVwiIWlzTG9hZGVkXCI+XG4gICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImNvbnRhY3RBY3Rpb25zPy5sZW5ndGggPT09IDAgJiYgaXNMb2FkZWRcIlxuICAgICAgY2xhc3M9XCJweC0yXCI+XG4gICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLkFjdGlvbnMuQWN0aW9uTWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gd3JhcHBlciBmb3IgaW5maW5pdGUgc2Nyb2xsIC0tPlxuICAgIDxkaXYgI3NlbGVjdG9yIGNsYXNzPVwicGVuZGluZy1hY3Rpb25zLXdyYXBwZXJcIlxuICAgICAgaW5maW5pdGVTY3JvbGxcbiAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIlxuICAgICAgW2luZmluaXRlU2Nyb2xsQ29udGFpbmVyXT1cInNlbGVjdG9yXCJcbiAgICAgIFtmcm9tUm9vdF09XCJ0cnVlXCJcbiAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbFBlbmRpbmdBY3Rpb25zKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi00IGFjdGlvbi1jYXJkIGJnLXdoaXRlXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBjb250YWN0QWN0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicC0yXCI+XG4gICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1pbmxpbmVcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtaW5saW5lLWl0ZW0gbWUtMlwiPlxuICAgICAgICAgICAgICA8aDYgKm5nSWY9XCIhdXBkYXRpbmcgfHwgYWN0aW9uSWQgIT09IGFjdGlvbi5pZFwiPlxuICAgICAgICAgICAgICAgIHt7IGFjdGlvbi53aGVuX3Nob3J0X2RhdGUgfX1cbiAgICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwidXBkYXRpbmcgJiYgYWN0aW9uSWQgPT09IGFjdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJkZC1tbW0teXl5eVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjdGlvbi53aGVuX3Nob3J0X2RhdGVcIlxuICAgICAgICAgICAgICAgIG5nYkRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAjZD1cIm5nYkRhdGVwaWNrZXJcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJkLnRvZ2dsZSgpXCJcbiAgICAgICAgICAgICAgICAoZGF0ZVNlbGVjdCk9XCJvbkRhdGVTZWxlY3QoJGV2ZW50LCBhY3Rpb24pXCIgLz5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIHdoZW4tYnRuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVQaWNrZXIoYWN0aW9uPy5pZClcIj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiQ2xpY2sgdG8gRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWlubGluZS1pdGVtXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctcHJpbWFyeVwiPnt7IGFjdGlvbi5jcm1fYWN0aW9uPy5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbi5vd25lcj8udXNlcl9hdmF0YXI/Lmxlbmd0aCA+IDA7IGVsc2Ugbm9Qcm9maWxlSW1nXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3duZXJfaW1hZ2Ugb2YgYWN0aW9uLm93bmVyPy51c2VyX2F2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTJcIiAqbmdJZj1cIm93bmVyX2ltYWdlLndpZHRoID09PSA1MFwiICBbbmdiVG9vbHRpcF09XCJhY3Rpb24ub3duZXIuZmlyc3RfbmFtZSArICcgJyArYWN0aW9uLm93bmVyLmxhc3RfbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci1pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1nLWZsdWlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwib3duZXJfaW1hZ2UudXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIk1hbGUgSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaGFuZGxlSW1hZ2VFcnJvcigkZXZlbnQsICdhc3NldHMvaW1nL2ljb25zL21hbGUucG5nJylcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Qcm9maWxlSW1nPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBteS0yXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci1pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgc3JjPVwiL2Fzc2V0cy9pbWcvaWNvbnMvbWFsZS5wbmdcIlxuICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbWctZmx1aWRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2xpPlxuXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWlubGluZS1pdGVtIGZsb2F0LWVuZFwiPlxuICAgICAgICAgICAgICA8YSAqbmdJZj1cImFjdGlvbj8uY3JtX2NvbnRhY3RcIlxuICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJTZWUgdGhpcyBjb250YWN0XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VlIHRoaXMgY29udGFjdFwiXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj8uY3JtX2NvbnRhY3Q/LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV5ZSBtZS0zIHNlZS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxhIG5nYlRvb2x0aXA9XCJTZXQgYXMgY29tcGxldGVkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2V0IGFzIGNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0zXCJcbiAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEFzQ29tcGxldGVkKGFjdGlvbi5pZCwgYWN0aW9uLCBpKVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGFza3MgY3RhMS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxhIG5nYlRvb2x0aXA9XCJTZXQgYXMgY2FuY2VsbGVkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2V0IGFzIGNhbmNlbGxlZFwiXG4gICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRBc0NhbmNlbGxlZChhY3Rpb24uaWQsIGFjdGlvbiwgaSlcIj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10aW1lcyB0ZXh0LWRhbmdlciBkZWxldGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPHAgW2NsYXNzLnRleHQtZGFuZ2VyXT1cIiFhY3Rpb24uY29sb3JcIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi0wXCJcbiAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uLmR1ZVwiPlxuICAgICAgICAgICAge3sgYWN0aW9uLmR1ZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cCAqbmdJZj1cImFjdGlvbi5vd25lcj8uaWQgIT09IHVzZXJJZFwiXG4gICAgICAgICAgICBjbGFzcz1cIm0tMCBtdC0xXCI+XG4gICAgICAgICAgICA8YSBjbGFzcz1cImZvbnQtaXRhbGljIGdyZXlcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9tZW1iZXJzJywgYWN0aW9uPy5vd25lcj8uc2x1Z11cIj5BZGRlZCBieVxuICAgICAgICAgICAgICB7eyBhY3Rpb24ub3duZXI/LmZpcnN0X25hbWUgKyAnICcgKyBhY3Rpb24ub3duZXI/Lmxhc3RfbmFtZSB9fTwvYT5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtdC0xIG1iLTEgZnctYm9sZFwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uPy5jcm1fY29udGFjdFwiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPy5jcm1fY29udGFjdD8uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj8uY3JtX2NvbnRhY3Q/LmZpcnN0X25hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj8uY3JtX2NvbnRhY3Q/Lmxhc3RfbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YSAqbmdJZj1cIiFhY3Rpb24uY3JtX2NvbnRhY3RfaWRcIj5OL0E8L2E+IGF0XG4gICAgICAgICAgICA8YSAqbmdJZj1cImFjdGlvbi5jcm1fYWNjb3VudF9pZFwiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5hY2NvdW50SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPy5jcm1fYWNjb3VudD8uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgIHt7IGFjdGlvbj8uY3JtX2FjY291bnQ/Lm5hbWUgfX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnQtc2VjdGlvblwiPlxuICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwibXQtMSB0ZXh0YXJlYSBmb3JtLWNvbnRyb2wgbWItMlwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWN0aW9uLmNvbW1lbnRcIj57eyBhY3Rpb24uY29tbWVudCB9fTwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwibXktMSBjb21tZW50XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFzaG93RnVsbENvbW1lbnQgfHwgYWN0aW9uLmlkICE9PSBjb21tZW50SWRcIj5cbiAgICAgICAgICAgICAgICB7eyBhY3Rpb24uY29tbWVudCB8IHNsaWNlOiAwOjIzMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTxhICpuZ0lmPVwiYWN0aW9uLmNvbW1lbnQubGVuZ3RoID4gMjMwXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dGdWxsQ29tbWVudCA9IHRydWU7IGNvbW1lbnRJZCA9IGFjdGlvbi5pZFwiPi4uLnNob3cgbW9yZVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cIm15LTEgY29tbWVudFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RnVsbENvbW1lbnQgJiYgYWN0aW9uLmlkID09PSBjb21tZW50SWRcIj5cbiAgICAgICAgICAgICAgICB7eyBhY3Rpb24uY29tbWVudCB9fVxuICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiYWN0aW9uLmNvbW1lbnQubGVuZ3RoID4gMjMwICYmIHNob3dGdWxsQ29tbWVudFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0Z1bGxDb21tZW50ID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPi4uLnNob3cgbGVzczwvYT5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBlZGl0LWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRDb21tZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWVkaXQgZWRpdC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtYnRucyBlZGl0LWNvbnRyb2wtYnRuc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1kZWZhdWx0IG1lLTJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29tbWVudCh1bmRlZmluZWQpXCI+XG4gICAgICAgICAgICAgICAge3sgJ0J1dHRvbi5DYW5jZWwnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZUNvbW1lbnQoYWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgIHt7ICdCdXR0b24uU3VibWl0JyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCEtLSBTdWdnZXN0ZWQgQWN0aW9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zXCI+XG4gICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5BSSBTdWdnZXN0ZWQgQWN0aW9uczwvaDU+XG4gICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIlxuICAgICAgKm5nSWY9XCIhaXNMb2FkZWRcIj5cbiAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICA8L2Rpdj5cblxuXG4gICAgPGRpdiAjc3VnZ2VzdGVkQWN0aW9uc1NlbGVjdG9yICpuZ0lmPVwiYWNjb3VudEFjdGlvblN1Z2dlc3RlZD8ubGVuZ3RoID4gMFwiIGNsYXNzPVwic3VnZ2VzdGVkLWFjdGlvbnMtd3JhcHBlclwiXG4gICAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbENvbnRhaW5lcl09XCJzdWdnZXN0ZWRBY3Rpb25zU2VsZWN0b3JcIlxuICAgICAgICBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgYWN0aW9uLWNhcmQgYmctd2hpdGVcIlxuICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBzdWdnZXN0ZWRBY3Rpb24gb2YgYWNjb3VudEFjdGlvblN1Z2dlc3RlZFxuICAgICAgICAgICAgICAgICAgICAgIHwgcGFnaW5hdGU6IHsgaWQ6ICdzdWdnZXN0ZWRBY3Rpb24nLCBpdGVtc1BlclBhZ2U6IDEwLCBjdXJyZW50UGFnZTogcDEgfTtcbiAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLTJcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm10LTEgbWItMSBmdy1ib2xkXCI+XG4gICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmFjY291bnRJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkQWN0aW9uPy5jcm1fYWNjb3VudD8uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiPnt7IHN1Z2dlc3RlZEFjdGlvbj8uY3JtX2FjY291bnQ/Lm5hbWUgfX08L2E+XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnctYm9sZCBtYi0xXCI+e3sgc3VnZ2VzdGVkQWN0aW9uLmNybV9hY3Rpb24gfX08L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgc3VnZ2VzdGVkQWN0aW9uLnJlYXNvbiB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcGFnaW5hdGlvbi1jb250cm9scyB3LTEwMCBtdC0zXCJcbiAgICAgICpuZ0lmPVwiYWNjb3VudEFjdGlvblN1Z2dlc3RlZD8ubGVuZ3RoID4gMTBcIj5cbiAgICAgIDxwYWdpbmF0aW9uLWNvbnRyb2xzIGlkPVwic3VnZ2VzdGVkQWN0aW9uXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2UpPVwicDEgPSAkZXZlbnRcIj5cbiAgICAgIDwvcGFnaW5hdGlvbi1jb250cm9scz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiYWNjb3VudEFjdGlvblN1Z2dlc3RlZC5sZW5ndGggPT09IDAgJiYgaXNMb2FkZWRTdWdnZXN0ZWRcIlxuICAgICAgY2xhc3M9XCJweC0yXCI+XG4gICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLkFjdGlvbnMuQWN0aW9uU3VnZ2VzdGlvbnNNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgPC9wdy1uby1kYXRhPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLWFjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLWFjdGlvbnMvc21hcnQtY3JtLWFjdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLWFjdGlvbnMvc21hcnQtY3JtLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RCxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUUvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFPMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGdCQUFnQjtJQStCckQsWUFDcUIsVUFBc0IsRUFDdkMsUUFBa0IsRUFDaUIsUUFBa0I7UUFFckQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSkMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUVKLGFBQVEsR0FBUixRQUFRLENBQVU7UUFqQ2pELHdCQUFtQixHQUFH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c0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgc3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XG5cbmltcG9ydCB7IFJPVVRFUlMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcm91dGVycy9yb3V0ZXJzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwdy1jcm0tYWN0aW9ucycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWNybS1hY3Rpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zbWFydC1jcm0tYWN0aW9ucy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENybUFjdGlvbnNDb21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgdG90YWxQZW5kaW5nQWN0aW9ucyA9IDA7XG5cbiAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnRhY3RJZDogbnVtYmVyO1xuICAgIHVzZXJJZDogbnVtYmVyO1xuICAgIGFjdGlvbklkOiBudW1iZXI7XG4gICAgY29tbWVudElkOiBudW1iZXI7XG5cbiAgICBwOiBudW1iZXI7XG4gICAgcDE6IG51bWJlcjtcbiAgICBjdXJyZW50UGFnZSA9IDE7XG5cbiAgICBjb250YWN0QWN0aW9ucyA9IFtdO1xuICAgIGNvbnRhY3RBY3Rpb25zQWxsID0gW107XG4gICAgYWNjb3VudEFjdGlvblN1Z2dlc3RlZCA9IFtdO1xuICAgIGFsbFN1YnNjcmlwdGlvbk1lbWJlcnM6IHN0cmluZ1tdO1xuXG4gICAgc2VsZWN0b3IgPSAnLnBlbmRpbmctYWN0aW9ucy13cmFwcGVyJztcbiAgICBzdWdnZXN0ZWRBY3Rpb25zU2VsZWN0b3IgPSAnLnN1Z2dlc3RlZC1hY3Rpb25zLXdyYXBwZXInO1xuXG4gICAgaXNMb2FkZWQgPSBmYWxzZTtcbiAgICBpc0xvYWRlZFN1Z2dlc3RlZCA9IGZhbHNlO1xuICAgIHNob3dGdWxsQ29tbWVudCA9IGZhbHNlO1xuICAgIHNob3dGaWx0ZXIgPSBmYWxzZTtcbiAgICB1cGRhdGluZyA9IGZhbHNlO1xuICAgIGRhbmdlckNvbG9yOiBib29sZWFuO1xuXG4gICAgcm91dGVycyA9IFJPVVRFUlM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjcm1TZXJ2aWNlOiBDcm1TZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50QWN0aW9ucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEFjdGlvblN1Z2dlc3RlZCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51c2VyU3RvcmUoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHJlcy5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25TY3JvbGxQZW5kaW5nQWN0aW9ucygpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSsrO1xuICAgICAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWxQZW5kaW5nQWN0aW9ucyAvIDUpO1xuICAgICAgICAvLyBQcmV2ZW50IEFQSSBjYWxsIGlmIGFsbCByZWNvcmRzIGhhdmUgYmVlbiBmZXRjaGVkXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlIDw9IHRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEFjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYWxsIGFjdGlvbnMgKi9cbiAgICBwcml2YXRlIGdldEFjY291bnRBY3Rpb25zKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRBY2NvdW50QWN0aW9ucyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIHsgcGFnZTogdGhpcy5jdXJyZW50UGFnZSwgcGFnZV9zaXplOiAxMCB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2U/LmNybV9hY2NvdW50X2FjdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3RhbFBlbmRpbmdBY3Rpb25zID0gcmVzcG9uc2U/Lm9iamVjdF9jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEFjdGlvbnNBbGwgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5jb250YWN0QWN0aW9uc0FsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXNwb25zZS5jcm1fYWNjb3VudF9hY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0QWN0aW9uc0FsbCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi51bmlxQnkodGhpcy5jb250YWN0QWN0aW9uc0FsbC50b1JldmVyc2VkKCksICdpZCcpLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEFjdGlvbnNBbGwuZm9yRWFjaChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLndoZW5fc2hvcnRfZGF0ZSA9IG1vbWVudChkYXRhLndoZW4pLmZvcm1hdCgnREQtTU1NLVlZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gbW9tZW50KG5ldyBEYXRlKGRhdGEud2hlbikpLmRpZmYoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudChuZXcgRGF0ZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RheXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9tZW50KG5ldyBEYXRlKGRhdGEud2hlbikpIDwgbW9tZW50KG5ldyBEYXRlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2R1ZSddID0gYE92ZXJkdWUgYnkgJHtNYXRoLmFicyhkaWZmKX0gZGF5c2A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2NvbG9yJ10gPSB0aGlzLmRhbmdlckNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2R1ZSddID0gYEluICR7ZGlmZn0gZGF5c2A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2NvbG9yJ10gPSAhdGhpcy5kYW5nZXJDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEFjdGlvbnNBbGwuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShhLndoZW4pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIud2hlbikuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RBY3Rpb25zID0gWy4uLnRoaXMuY29udGFjdEFjdGlvbnNBbGxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxTdWJzY3JpcHRpb25NZW1iZXJzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lck9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0QWN0aW9uc0FsbC5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGRhdGEub3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJPYmplY3RbaWRdID0gZGF0YS5vd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMob3duZXJPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxTdWJzY3JpcHRpb25NZW1iZXJzLnB1c2gob3duZXJPYmplY3RbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RmlsdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hbGxTdWJzY3JpcHRpb25NZW1iZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dGaWx0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW1hZ2VFcnJvcihldmVudDogRXZlbnQsIGZhbGxiYWNrUGF0aCk6IHZvaWQge1xuICAgICAgICBIZWxwZXJTZXJ2aWNlLmhhbmRsZUltYWdlRmFsbGJhY2tQYXRoKGV2ZW50LCBmYWxsYmFja1BhdGgpO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYWNjb3VudCBhY3Rpb24gc3VnZ2VzdGVkICovXG4gICAgcHJpdmF0ZSBnZXRBY2NvdW50QWN0aW9uU3VnZ2VzdGVkKHN1YnNjcmlwdGlvbl9pZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldEFjY291bnRBY3Rpb25TdWdnZXN0ZWQoc3Vic2NyaXB0aW9uX2lkKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50QWN0aW9uU3VnZ2VzdGVkID0gcmVzcG9uc2U/LmNybV9hY2NvdW50X2FjdGlvbnMgfHwgW107XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZFN1Z2dlc3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlZGl0Q29tbWVudChldmVudCkge1xuICAgICAgICBjb25zdCBjb21tZW50cyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgICAgICdjb21tZW50LXNlY3Rpb24nXG4gICAgICAgICkgYXMgSFRNTENvbGxlY3Rpb25PZjxFbGVtZW50PiAmIEl0ZXJhYmxlPEVsZW1lbnQ+O1xuICAgICAgICBpZiAoZXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuY29tbWVudC1zZWN0aW9uJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93LWNvbnRyb2xzJykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbW1lbnQgb2YgY29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93LWNvbnRyb2xzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdCgnLmNvbW1lbnQtc2VjdGlvbicpLmNsYXNzTGlzdC5hZGQoJ3Nob3ctY29udHJvbHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBjb21tZW50cykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdy1jb250cm9scycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYoZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5jb21tZW50LXNlY3Rpb24nKS5jbGFzc0xpc3QuZmluZCgpKVxuICAgIH1cblxuICAgIHVwZGF0ZUNvbW1lbnQoYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbW1lbnRPYmogPSB7XG4gICAgICAgICAgICBjb21tZW50OiBhY3Rpb24uY29tbWVudCxcbiAgICAgICAgICAgIGNvbXBsZXRlZDogYWN0aW9uLmNvbXBsZXRlZCxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogYWN0aW9uLmNhbmNlbGxlZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGFjdGlvbi5pZCwgY29tbWVudE9iailcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnY29tbWVudCB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvbW1lbnQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFjY291bnRBY3Rpb25zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2V0IHRoZSBhY3Rpb24gYXMgY29tcGxldGVkICovXG4gICAgc2V0QXNDb21wbGV0ZWQoaWQ6IG51bWJlciwgYWN0aW9uLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBzd2FsXG4gICAgICAgICAgICAuZmlyZSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIGh0bWw6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2V0IGFzIENvbXBsZXRlZD9gLFxuICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3dhcm5pbmcnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbk9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGFjdGlvbi5jb21tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkOiBhY3Rpb24uY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RBY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2V0IHRoZSBhY3Rpb24gYXMgY2FuY2VsbGVkICovXG4gICAgc2V0QXNDYW5jZWxsZWQoaWQ6IG51bWJlciwgYWN0aW9uLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBzd2FsXG4gICAgICAgICAgICAuZmlyZSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDYW5jZWwnLFxuICAgICAgICAgICAgICAgIGh0bWw6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2V0IGFzIGNhbmNlbGxlZD9gLFxuICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3dhcm5pbmcnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbk9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGFjdGlvbi5jb21tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkOiBhY3Rpb24uY29tcGxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RBY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2hvdyBEYXRlUGlja2VyICovXG4gICAgc2hvd0RhdGVQaWNrZXIoYWN0aW9uSWQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnVwZGF0aW5nID0gIXRoaXMudXBkYXRpbmc7XG4gICAgICAgIHRoaXMuYWN0aW9uSWQgPSBhY3Rpb25JZDtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBkYXRlICovXG4gICAgb25EYXRlU2VsZWN0KGV2ZW50LCBhY3Rpb24pIHtcbiAgICAgICAgY29uc3QgY29tbWVudE9iaiA9IHtcbiAgICAgICAgICAgIHdoZW46IEhlbHBlclNlcnZpY2UuZGF0ZUZvcm1hdChldmVudCksXG4gICAgICAgICAgICBjb21tZW50OiBhY3Rpb24uY29tbWVudCxcbiAgICAgICAgICAgIGNvbXBsZXRlZDogYWN0aW9uLmNvbXBsZXRlZCxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogYWN0aW9uLmNhbmNlbGxlZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGFjdGlvbi5pZCwgY29tbWVudE9iailcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnZGF0ZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEFjdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZmlsdGVyIHRoZSBkYXRhIGJ5IHVzZXIgKi9cbiAgICBmaWx0ZXJCeVVzZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICBpZiAodXNlcklkICE9PSAnMCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuY29udGFjdEFjdGlvbnNBbGwuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGFjdGlvbiA9PiBhY3Rpb24ub3duZXJfaWQgPT09IE51bWJlcih1c2VySWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb250YWN0QWN0aW9ucyA9IGZpbHRlcmVkRGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFjdEFjdGlvbnMgPSB0aGlzLmNvbnRhY3RBY3Rpb25zQWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTBcIj5cbiAgICAgIDxoMj57eyAnQ3JtLkFjdGlvbnMuVGl0bGUnIHwgdHJhbnNsb2NvIH19PC9oMj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zIGZsb2F0LXN0YXJ0IG1iLTJcIlxuICAgICAgKm5nSWY9XCJzaG93RmlsdGVyXCI+XG4gICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxuICAgICAgICAoY2hhbmdlKT1cImZpbHRlckJ5VXNlcigkZXZlbnQpXCI+XG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCIwXCI+RmlsdGVyIGJ5IHVzZXI8L29wdGlvbj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbWVtYmVyIG9mIGFsbFN1YnNjcmlwdGlvbk1lbWJlcnNcIlxuICAgICAgICAgIFt2YWx1ZV09XCJtZW1iZXIuaWRcIj5cbiAgICAgICAgICB7eyBtZW1iZXIuZmlyc3RfbmFtZSB9fSB7eyBtZW1iZXIubGFzdF9uYW1lIH19XG4gICAgICAgIDwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IGZsb2F0LWVuZFwiXG4gICAgZGF0YS1jeT1cImFkZC1vcHBvcnR1bml0aWVzXCJcbiAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5vcHBvcnR1bml0eUFkZF1cIj5cbiAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQWRkT3Bwb3J0dW5pdHknIHwgdHJhbnNsb2NvIH19XG4gICAgPC9hPlxuICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgZmxvYXQtZW5kIG1lLTNcIlxuICAgICAgICBkYXRhLWN5PVwiYWRkLWNvbnRhY3RcIlxuICAgICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5hZGRBY2NvdW50XVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICB7eyAnQ3JtLkFjY291bnRNZXNzYWdlLkFkZEFjY291bnQnIHwgdHJhbnNsb2NvIH19XG4gICAgICA8L2E+XG4gICAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmQgbWUtM1wiXG4gICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0QWRkXVwiXG4gICAgICBkYXRhLWN5PVwiYWRkLWFjdGlvblwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuQWRkQ29udGFjdCcgfCB0cmFuc2xvY28gfX1cbiAgICA8L2E+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8IS0tIFBlbmRpbmcgQWN0aW9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zXCI+XG4gICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5QZW5kaW5nIEFjdGlvbnM8L2g1PlxuICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCJcbiAgICAgICpuZ0lmPVwiIWlzTG9hZGVkXCI+XG4gICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImNvbnRhY3RBY3Rpb25zPy5sZW5ndGggPT09IDAgJiYgaXNMb2FkZWRcIlxuICAgICAgY2xhc3M9XCJweC0yXCI+XG4gICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLkFjdGlvbnMuQWN0aW9uTWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gd3JhcHBlciBmb3IgaW5maW5pdGUgc2Nyb2xsIC0tPlxuICAgIDxkaXYgI3NlbGVjdG9yIGNsYXNzPVwicGVuZGluZy1hY3Rpb25zLXdyYXBwZXJcIlxuICAgICAgaW5maW5pdGVTY3JvbGxcbiAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIlxuICAgICAgW2luZmluaXRlU2Nyb2xsQ29udGFpbmVyXT1cInNlbGVjdG9yXCJcbiAgICAgIFtmcm9tUm9vdF09XCJ0cnVlXCJcbiAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbFBlbmRpbmdBY3Rpb25zKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi00IGFjdGlvbi1jYXJkIGJnLXdoaXRlXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBjb250YWN0QWN0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicC0yXCI+XG4gICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1pbmxpbmVcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtaW5saW5lLWl0ZW0gbWUtMlwiPlxuICAgICAgICAgICAgICA8aDYgKm5nSWY9XCIhdXBkYXRpbmcgfHwgYWN0aW9uSWQgIT09IGFjdGlvbi5pZFwiPlxuICAgICAgICAgICAgICAgIHt7IGFjdGlvbi53aGVuX3Nob3J0X2RhdGUgfX1cbiAgICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwidXBkYXRpbmcgJiYgYWN0aW9uSWQgPT09IGFjdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJkZC1tbW0teXl5eVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjdGlvbi53aGVuX3Nob3J0X2RhdGVcIlxuICAgICAgICAgICAgICAgIG5nYkRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAjZD1cIm5nYkRhdGVwaWNrZXJcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJkLnRvZ2dsZSgpXCJcbiAgICAgICAgICAgICAgICAoZGF0ZVNlbGVjdCk9XCJvbkRhdGVTZWxlY3QoJGV2ZW50LCBhY3Rpb24pXCIgLz5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIHdoZW4tYnRuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVQaWNrZXIoYWN0aW9uPy5pZClcIj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiQ2xpY2sgdG8gRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWlubGluZS1pdGVtXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctcHJpbWFyeVwiPnt7IGFjdGlvbi5jcm1fYWN0aW9uPy5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbi5vd25lcj8udXNlcl9hdmF0YXI/Lmxlbmd0aCA+IDA7IGVsc2Ugbm9Qcm9maWxlSW1nXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3duZXJfaW1hZ2Ugb2YgYWN0aW9uLm93bmVyPy51c2VyX2F2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTJcIiAqbmdJZj1cIm93bmVyX2ltYWdlLndpZHRoID09PSA1MFwiICBbbmdiVG9vbHRpcF09XCJhY3Rpb24ub3duZXIuZmlyc3RfbmFtZSArICcgJyArYWN0aW9uLm93bmVyLmxhc3RfbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci1pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1nLWZsdWlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwib3duZXJfaW1hZ2UudXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIk1hbGUgSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaGFuZGxlSW1hZ2VFcnJvcigkZXZlbnQsICdhc3NldHMvaW1nL2ljb25zL21hbGUucG5nJylcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Qcm9maWxlSW1nPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBteS0yXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci1pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgc3JjPVwiL2Fzc2V0cy9pbWcvaWNvbnMvbWFsZS5wbmdcIlxuICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbWctZmx1aWRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2xpPlxuXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWlubGluZS1pdGVtIGZsb2F0LWVuZFwiPlxuICAgICAgICAgICAgICA8YSAqbmdJZj1cImFjdGlvbj8uY3JtX2NvbnRhY3RcIlxuICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJTZWUgdGhpcyBjb250YWN0XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VlIHRoaXMgY29udGFjdFwiXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj8uY3JtX2NvbnRhY3Q/LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV5ZSBtZS0zIHNlZS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxhIG5nYlRvb2x0aXA9XCJTZXQgYXMgY29tcGxldGVkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2V0IGFzIGNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0zXCJcbiAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEFzQ29tcGxldGVkKGFjdGlvbi5pZCwgYWN0aW9uLCBpKVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGFza3MgY3RhMS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxhIG5nYlRvb2x0aXA9XCJTZXQgYXMgY2FuY2VsbGVkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2V0IGFzIGNhbmNlbGxlZFwiXG4gICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRBc0NhbmNlbGxlZChhY3Rpb24uaWQsIGFjdGlvbiwgaSlcIj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10aW1lcyB0ZXh0LWRhbmdlciBkZWxldGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPHAgW2NsYXNzLnRleHQtZGFuZ2VyXT1cIiFhY3Rpb24uY29sb3JcIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi0wXCJcbiAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uLmR1ZVwiPlxuICAgICAgICAgICAge3sgYWN0aW9uLmR1ZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cCAqbmdJZj1cImFjdGlvbi5vd25lcj8uaWQgIT09IHVzZXJJZFwiXG4gICAgICAgICAgICBjbGFzcz1cIm0tMCBtdC0xXCI+XG4gICAgICAgICAgICA8YSBjbGFzcz1cImZvbnQtaXRhbGljIGdyZXlcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9tZW1iZXJzJywgYWN0aW9uPy5vd25lcj8uc2x1Z11cIj5BZGRlZCBieVxuICAgICAgICAgICAgICB7eyBhY3Rpb24ub3duZXI/LmZpcnN0X25hbWUgKyAnICcgKyBhY3Rpb24ub3duZXI/Lmxhc3RfbmFtZSB9fTwvYT5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtdC0xIG1iLTEgZnctYm9sZFwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uPy5jcm1fY29udGFjdFwiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPy5jcm1fY29udGFjdD8uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj8uY3JtX2NvbnRhY3Q/LmZpcnN0X25hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj8uY3JtX2NvbnRhY3Q/Lmxhc3RfbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YSAqbmdJZj1cIiFhY3Rpb24uY3JtX2NvbnRhY3RfaWRcIj5OL0E8L2E+IGF0XG4gICAgICAgICAgICA8YSAqbmdJZj1cImFjdGlvbi5jcm1fYWNjb3VudF9pZFwiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5hY2NvdW50SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPy5jcm1fYWNjb3VudD8uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgIHt7IGFjdGlvbj8uY3JtX2FjY291bnQ/Lm5hbWUgfX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnQtc2VjdGlvblwiPlxuICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwibXQtMSB0ZXh0YXJlYSBmb3JtLWNvbnRyb2wgbWItMlwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWN0aW9uLmNvbW1lbnRcIj57eyBhY3Rpb24uY29tbWVudCB9fTwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwibXktMSBjb21tZW50XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFzaG93RnVsbENvbW1lbnQgfHwgYWN0aW9uLmlkICE9PSBjb21tZW50SWRcIj5cbiAgICAgICAgICAgICAgICB7eyBhY3Rpb24uY29tbWVudCB8IHNsaWNlOiAwOjIzMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTxhICpuZ0lmPVwiYWN0aW9uLmNvbW1lbnQubGVuZ3RoID4gMjMwXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dGdWxsQ29tbWVudCA9IHRydWU7IGNvbW1lbnRJZCA9IGFjdGlvbi5pZFwiPi4uLnNob3cgbW9yZVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cIm15LTEgY29tbWVudFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RnVsbENvbW1lbnQgJiYgYWN0aW9uLmlkID09PSBjb21tZW50SWRcIj5cbiAgICAgICAgICAgICAgICB7eyBhY3Rpb24uY29tbWVudCB9fVxuICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiYWN0aW9uLmNvbW1lbnQubGVuZ3RoID4gMjMwICYmIHNob3dGdWxsQ29tbWVudFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0Z1bGxDb21tZW50ID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPi4uLnNob3cgbGVzczwvYT5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBlZGl0LWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRDb21tZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWVkaXQgZWRpdC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtYnRucyBlZGl0LWNvbnRyb2wtYnRuc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1kZWZhdWx0IG1lLTJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29tbWVudCh1bmRlZmluZWQpXCI+XG4gICAgICAgICAgICAgICAge3sgJ0J1dHRvbi5DYW5jZWwnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZUNvbW1lbnQoYWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgIHt7ICdCdXR0b24uU3VibWl0JyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCEtLSBTdWdnZXN0ZWQgQWN0aW9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zXCI+XG4gICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5BSSBTdWdnZXN0ZWQgQWN0aW9uczwvaDU+XG4gICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIlxuICAgICAgKm5nSWY9XCIhaXNMb2FkZWRcIj5cbiAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICA8L2Rpdj5cblxuXG4gICAgPGRpdiAjc3VnZ2VzdGVkQWN0aW9uc1NlbGVjdG9yICpuZ0lmPVwiYWNjb3VudEFjdGlvblN1Z2dlc3RlZD8ubGVuZ3RoID4gMFwiIGNsYXNzPVwic3VnZ2VzdGVkLWFjdGlvbnMtd3JhcHBlclwiXG4gICAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbENvbnRhaW5lcl09XCJzdWdnZXN0ZWRBY3Rpb25zU2VsZWN0b3JcIlxuICAgICAgICBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgYWN0aW9uLWNhcmQgYmctd2hpdGVcIlxuICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBzdWdnZXN0ZWRBY3Rpb24gb2YgYWNjb3VudEFjdGlvblN1Z2dlc3RlZFxuICAgICAgICAgICAgICAgICAgICAgIHwgcGFnaW5hdGU6IHsgaWQ6ICdzdWdnZXN0ZWRBY3Rpb24nLCBpdGVtc1BlclBhZ2U6IDEwLCBjdXJyZW50UGFnZTogcDEgfTtcbiAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLTJcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm10LTEgbWItMSBmdy1ib2xkXCI+XG4gICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmFjY291bnRJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkQWN0aW9uPy5jcm1fYWNjb3VudD8uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiPnt7IHN1Z2dlc3RlZEFjdGlvbj8uY3JtX2FjY291bnQ/Lm5hbWUgfX08L2E+XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnctYm9sZCBtYi0xXCI+e3sgc3VnZ2VzdGVkQWN0aW9uLmNybV9hY3Rpb24gfX08L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgc3VnZ2VzdGVkQWN0aW9uLnJlYXNvbiB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcGFnaW5hdGlvbi1jb250cm9scyB3LTEwMCBtdC0zXCJcbiAgICAgICpuZ0lmPVwiYWNjb3VudEFjdGlvblN1Z2dlc3RlZD8ubGVuZ3RoIDwgMTBcIj5cbiAgICAgIDxwYWdpbmF0aW9uLWNvbnRyb2xzIGlkPVwic3VnZ2VzdGVkQWN0aW9uXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2UpPVwicDEgPSAkZXZlbnRcIj5cbiAgICAgIDwvcGFnaW5hdGlvbi1jb250cm9scz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiYWNjb3VudEFjdGlvblN1Z2dlc3RlZC5sZW5ndGggPT09IDAgJiYgaXNMb2FkZWRTdWdnZXN0ZWRcIlxuICAgICAgY2xhc3M9XCJweC0yXCI+XG4gICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLkFjdGlvbnMuQWN0aW9uU3VnZ2VzdGlvbnNNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgPC9wdy1uby1kYXRhPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19