tnx-shared 5.2.28 → 5.2.29

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.
Files changed (85) hide show
  1. package/assets/docker/docker-entrypoint.sh +1 -1
  2. package/classes/base/list-component-base.d.ts +19 -5
  3. package/classes/base/list-component-base.d.ts.map +1 -1
  4. package/classes/environment-schema.d.ts +23 -20
  5. package/classes/environment-schema.d.ts.map +1 -1
  6. package/classes/public-function.d.ts +1 -0
  7. package/classes/public-function.d.ts.map +1 -1
  8. package/components/chat/chat-box/chat-box.component.d.ts.map +1 -1
  9. package/components/common-app-component/common-app-component.d.ts +1 -3
  10. package/components/common-app-component/common-app-component.d.ts.map +1 -1
  11. package/components/crud/advance-search/advance-search.component.d.ts +6 -6
  12. package/components/crud/advance-search/advance-search.component.d.ts.map +1 -1
  13. package/components/crud/crud-form/crud-form.component.d.ts +6 -0
  14. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  15. package/components/dropdown/dropdown.component.d.ts +5 -3
  16. package/components/dropdown/dropdown.component.d.ts.map +1 -1
  17. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  18. package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts +3 -0
  19. package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts.map +1 -1
  20. package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts.map +1 -1
  21. package/components/tn-tinymce/tn-tinymce.component.d.ts +2 -0
  22. package/components/tn-tinymce/tn-tinymce.component.d.ts.map +1 -1
  23. package/congviec/congviec/congviec-form/congviec-form.component.d.ts +1 -0
  24. package/congviec/congviec/congviec-form/congviec-form.component.d.ts.map +1 -1
  25. package/directives/primeng/tn-table.directive.d.ts +7 -6
  26. package/directives/primeng/tn-table.directive.d.ts.map +1 -1
  27. package/esm2020/classes/base/list-component-base.mjs +56 -32
  28. package/esm2020/classes/environment-schema.mjs +10 -1
  29. package/esm2020/classes/public-function.mjs +3 -1
  30. package/esm2020/components/add-news/add-news.component.mjs +3 -3
  31. package/esm2020/components/autocomplete-picker/autocomplete-picker.component.mjs +2 -2
  32. package/esm2020/components/chat/chat-box/chat-box.component.mjs +3 -4
  33. package/esm2020/components/chat/chat-send-message-box/chat-send-message-box.component.mjs +2 -2
  34. package/esm2020/components/common-app-component/common-app-component.mjs +57 -57
  35. package/esm2020/components/common-dashboard/common-dashboard.component.mjs +3 -3
  36. package/esm2020/components/crud/advance-search/advance-search.component.mjs +28 -19
  37. package/esm2020/components/crud/crud-form/crud-form.component.mjs +12 -4
  38. package/esm2020/components/crud/crud-list/crud-list.component.mjs +3 -3
  39. package/esm2020/components/crud/tree-table/tree-table.component.mjs +3 -3
  40. package/esm2020/components/dropdown/dropdown.component.mjs +29 -24
  41. package/esm2020/components/entity-permission/entity-permission.component.mjs +3 -3
  42. package/esm2020/components/entity-picker/entity-picker-box/entity-picker-box.component.mjs +3 -3
  43. package/esm2020/components/entity-picker/entity-picker-dialog/entity-picker-dialog.component.mjs +3 -3
  44. package/esm2020/components/file-explorer/file-manager/file-manager.component.mjs +3 -3
  45. package/esm2020/components/main-list/main-list.component.mjs +3 -3
  46. package/esm2020/components/query-builders/query-builder-rule/query-builder-rule.component.mjs +8 -3
  47. package/esm2020/components/radio-button-list/radio-button-list.component.mjs +3 -3
  48. package/esm2020/components/report-queue/report-queue.component.mjs +2 -2
  49. package/esm2020/components/settings/settings.component.mjs +3 -3
  50. package/esm2020/components/tn-app-help/tn-app-help.component.mjs +3 -3
  51. package/esm2020/components/tn-app-notification/tn-app-notification.component.mjs +3 -3
  52. package/esm2020/components/tn-custom-scrollbar/tn-custom-scrollbar.component.mjs +5 -4
  53. package/esm2020/components/tn-tinymce/tn-tinymce.component.mjs +7 -3
  54. package/esm2020/components/user-picker/user-picker-box/user-picker-box.component.mjs +3 -3
  55. package/esm2020/components/user-picker/user-picker.component.mjs +2 -2
  56. package/esm2020/components/workflow/workflow-picker/workflow-picker.component.mjs +3 -3
  57. package/esm2020/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.mjs +3 -3
  58. package/esm2020/congviec/congviec/congviec-form/congviec-form.component.mjs +6 -3
  59. package/esm2020/congviec/congviec/congviec.component.mjs +3 -3
  60. package/esm2020/directives/primeng/tn-table.directive.mjs +28 -13
  61. package/esm2020/services/common.service.mjs +11 -3
  62. package/esm2020/services/environment.service.mjs +48 -7
  63. package/esm2020/services/permission.service.mjs +12 -15
  64. package/esm2020/services/position.service.mjs +2 -2
  65. package/esm2020/services/signalr.service.mjs +3 -3
  66. package/esm2020/services/tn-client.service.mjs +30 -25
  67. package/esm2020/tnx-shared.module.mjs +14 -8
  68. package/fesm2015/tnx-shared.mjs +587 -445
  69. package/fesm2015/tnx-shared.mjs.map +1 -1
  70. package/fesm2020/tnx-shared.mjs +587 -445
  71. package/fesm2020/tnx-shared.mjs.map +1 -1
  72. package/package.json +2 -2
  73. package/services/common.service.d.ts +6 -0
  74. package/services/common.service.d.ts.map +1 -1
  75. package/services/environment.service.d.ts +32 -23
  76. package/services/environment.service.d.ts.map +1 -1
  77. package/services/permission.service.d.ts +5 -0
  78. package/services/permission.service.d.ts.map +1 -1
  79. package/services/position.service.d.ts.map +1 -1
  80. package/services/signalr.service.d.ts +1 -1
  81. package/services/signalr.service.d.ts.map +1 -1
  82. package/services/tn-client.service.d.ts +3 -1
  83. package/services/tn-client.service.d.ts.map +1 -1
  84. package/tnx-shared.module.d.ts +12 -11
  85. package/tnx-shared.module.d.ts.map +1 -1
@@ -1,5 +1,4 @@
1
1
  import { Component, Input, ViewChild } from '@angular/core';
2
- // import * as moment_ from 'moment';
3
2
  import moment from 'moment';
4
3
  import { ComponentContextService } from '../../../app-context/component-context.service';
5
4
  import { ComponentBase } from '../../../classes/base/component-base';
@@ -584,10 +583,10 @@ export class ChatBoxComponent extends ComponentBase {
584
583
  }
585
584
  }
586
585
  ChatBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ChatBoxComponent, deps: [{ token: i0.Injector }, { token: i1.ChatService }, { token: i2.MessageBoardService }, { token: i3.UserService }, { token: i4.CheckControlVisibleService }, { token: i5.SignalRService }, { token: i6.FileExplorerService }, { token: i7.CrudService }, { token: i8.NotifierService }, { token: i9.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
587
- ChatBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: ChatBoxComponent, selector: "chat-box", inputs: { taskId: "taskId", serviceCode: "serviceCode", entity: "entity", users: "users", showSendMessageBox: "showSendMessageBox" }, providers: [ComponentContextService, CheckControlVisibleService], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "fileElement", first: true, predicate: ["fileElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"dashboard\">\r\n <div class=\"chat\">\r\n <div class=\"group-info\">\r\n <a href=\"javascript:\">C\u00F3 {{peopleAll.length}} ng\u01B0\u1EDDi trong nh\u00F3m n\u00E0y</a>\r\n <div class=\"circleButton\" pTooltip=\"Xem to\u00E0n b\u1ED9 \u0111\u00EDnh k\u00E8m\" tooltipPosition=\"top\">\r\n <a href=\"javascript:\"><i class=\"far fa-images\"></i></a>\r\n </div>\r\n <div (click)=\"addPeople()\" class=\"circleButton\" pTooltip=\"Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi v\u00E0o nh\u00F3m\" tooltipPosition=\"top\"\r\n disabled=\"true\">\r\n <a href=\"javascript:\"><i class=\"fas fa-user-plus\"></i></a>\r\n </div>\r\n </div>\r\n <ul #scrollMe [ngClass]=\"{'hasPin': model.pinnedMessage != null}\">\r\n <li *ngIf=\"model.pinnedMessage\" class=\"clearfix pin\" [ngClass]=\"{'message-from': true}\">\r\n <ng-container\r\n *ngTemplateOutlet=\"messageItem; context: { i : -1, item: model.pinnedMessage, isPinnedMessage: true}\">\r\n </ng-container>\r\n </li>\r\n <li *ngFor=\"let item of model.dataSource; let i = index; trackBy: trackByFunc\" class=\"clearfix\"\r\n [ngClass]=\"{ 'message-own': item.type == 'own'}\">\r\n <ng-container *ngTemplateOutlet=\"messageItem; context: { i : i, item: item}\">\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <!-- <chat-send-message-box *ngIf=\"showSendMessageBox\"></chat-send-message-box>-->\r\n <div [ngClass]=\"{'visible2': model.scrolling, 'hidden2': !model.scrolling}\" class=\"scroll-to-bottom\">\r\n <span *ngIf=\"model.newMessageNotUpdatedCount > 0\" (click)=\"scrollToBottom(350, true, null)\">\r\n {{model.newMessageNotUpdatedCount <= 5 ? model.newMessageNotUpdatedCount : '5+' }} </span>\r\n <span (click)=\"scrollToBottom(350, true, null)\" *ngIf=\"model.newMessageNotUpdatedCount == 0\">\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<file-viewer *ngIf=\"fileViewerModel.showEditForm\" [parentContext]=\"context\" [parentModel]=\"model\"\r\n [model]=\"fileViewerModel\">\r\n</file-viewer>\r\n\r\n<ng-template #messageItem let-i=\"i\" let-isPinnedMessage=\"isPinnedMessage\" let-item=\"item\">\r\n <img *ngIf=\"item.isFirstMessageFlow && item.type != 'own' && !isPinnedMessage && item.avatar != null\" alt=\"\"\r\n class=\"chat-avatar\" src=\"{{getCurrentUserAvatar(item.avatar)}}\">\r\n <p *ngIf=\"(item.isFirstMessageFlow && item.type != 'own') && !isPinnedMessage\" class=\"message-created-by\">\r\n {{item.fullName}}\r\n </p>\r\n <span *ngIf=\"!hasAttachment(item)\">\r\n <!-- [class]=\"addClassToMessage(item, isPinnedMessage)\">-->\r\n <p *ngIf=\"!hasAttachment(item)\" class=\"message-content\">\r\n <i (click)=\"pinMessage(item)\" class=\"fas fa-thumbtack\" style=\"right: 0;\"></i>\r\n <i (click)=\"quickNote(item)\" class=\"fas fa-sticky-note\"></i>\r\n {{item.content}}\r\n </p>\r\n <p *ngIf=\"!isPinnedMessage && (item.isLastMessageFlow || !inTheSameTime(i, item, model.dataSource))\"\r\n class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n <p *ngIf=\"isPinnedMessage\" class=\"message-created\">\r\n {{item.createdBy}} \u0111\u00E3 g\u1EEDi l\u00FAc {{item.created | date:'dd/MM/yyyy HH:mm'}}\r\n </p>\r\n </span>\r\n <ng-container *ngIf=\"hasAttachment(item)\">\r\n <ng-container *ngFor=\"let attachmentItem of item.attachments;let index=index\">\r\n <div class=\"file\"\r\n [ngClass]=\"{'first':item.isFirstMessageFlow && index == 0, 'middle':index > 0 || !item.isFirstMessageFlow, 'image' : attachmentItem.type == 'image'}\"\r\n [ngStyle]=\"{'width': model.img[i + 'width' + index]}\">\r\n <p class=\"attachment\">\r\n <span (mouseup)=\"onMouseUp($event)\" class=\"attachment-item\">\r\n <a *ngIf=\"attachmentItem.type != 'image'\" (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <i class=\"fas fa-paperclip\"></i>{{attachmentItem.fileName}}\r\n </a>\r\n <a *ngIf=\"attachmentItem.type == 'image'\" #aElement\r\n [ngClass]=\"{'hidden': !model.img[i + '' + index], 'visible':model.img[i + '' + index]}\"\r\n (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <img class=\"message-img\" (load)=\"loadImg($event, i, index)\"\r\n [src]=\"attachmentItem.url | secure | async\" />\r\n </a>\r\n </span>\r\n </p>\r\n <div style=\"clear: both\"></div>\r\n <p class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n </div>\r\n <div style=\"clear: both\"></div>\r\n </ng-container>\r\n </ng-container>\r\n <after-view-checked *ngIf=\"model.dataSource.length == i + 1\" (loading)=\"scrollToBottom(0, false, item.sent)\">\r\n </after-view-checked>\r\n</ng-template>\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\"-->\r\n<!-- (onCancel)=\"userPickerForm.show = false\"-->\r\n<!-- (onHide)=\"userPickerForm.show = false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n<!-- <user-picker-box #formBase [control]=\"userPickerControl\"-->\r\n<!-- [(ngModel)]=\"this.peopleAll\" [multiple]=\"userPickerControl.multiple\">-->\r\n<!-- </user-picker-box>-->\r\n<!--</tn-dialog>-->\r\n\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\" (onHide)=\"userPickerForm.show == false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n\r\n<!-- &lt;!&ndash;<quick-add-form *ngIf=\"model.editFormModel.showQuickNoteForm\" [parentContext]=\"context\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; [parentModel]=\"context.data.noteDataModel\"></quick-add-form>&ndash;&gt;-->\r\n<!--</tn-dialog>-->", styles: [".paging-advance{list-style:none;padding-left:0;margin:3px 0}.paging-advance li{width:150px;padding-left:15px;line-height:30}.paging-advance li.disabled{color:#bdbdbd;outline:none}.paging-advance li.disabled:hover{cursor:default;background:none}.paging-advance li:hover{cursor:pointer;background:red}.paging-advance-overlay .ui-overlaypanel-content{padding:0}.paging-advance-overlay.ui-overlaypanel-shifted:before{right:auto;left:1.25em;margin-left:-10}.paging-advance-overlay.ui-overlaypanel-shifted:after{right:auto;left:1.25em;margin-left:-8px}.chat-avatar{height:36px;border:2px solid #eee}\n", "@charset \"UTF-8\";@import\"~@angular/material/prebuilt-themes/indigo-pink.css\";@import\"~jsoneditor/dist/jsoneditor.min.css\";.flex{display:flex}.flex .fit{flex:1 1}.flex.flex-column{flex-direction:column}.flex.flex-wrap{flex-wrap:wrap}.flex.center-v{align-items:center}.flex.center-h{justify-content:center}.flex.center-all{align-items:center;justify-content:center}.validate-item{color:#e00000;display:inline-block;font-size:.9em;white-space:nowrap;background-color:#fff}.tn-scroll-bar.bgWhite>div{background-color:#fff}.label-primary{padding:2px;border-radius:.25em;background-color:#1ab394;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.label-danger{padding:2px 5px;border-radius:.25em;background-color:#ed5565;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.label-warning{padding:2px;border-radius:.25em;background-color:#b8860b;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.label-secondary{padding:2px;border-radius:.25em;background-color:#a9a9a9;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.label-done{padding:2px;border-radius:.25em;background-color:#3b1ef7;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.text-navy{color:#1ab394!important}.text-danger{color:red!important}.fa-user-edit{font-size:14px}.flexcolumn{max-height:calc(100vh - 180px);min-height:80px;overflow-y:hidden;overflow-x:hidden;border:1px solid #eee;border-radius:5px}.has2ScrollZone2 .flexcolumn{max-height:calc(100vh - 180px)}.headerNoBorder>th{border:none!important;border-bottom:1px solid #eee!important}.cellNoBorder table tr td{border:0!important}.layout-wrapper .layout-main{padding:60px 0 0;overflow:hidden}div.circleButton{line-height:32px;border-radius:50%;width:32px;height:32px;text-align:center;position:relative;display:inline-block;transform:perspective(1px);overflow:hidden;margin-top:4px;margin-bottom:4px}div.circleButton>a{padding:0!important;line-height:32px}div.circleButton>a>i{width:24px!important}div.circleButton:before{content:\"\";position:absolute;inset:0;background:#e6e6e6;z-index:-1;transform:scale(0);transition:all cubic-bezier(.4,.34,.01,.97) .3s;border-radius:50%}div.circleButton:hover:before{transform:scale(1)}.message-notice{text-align:center;background:#e0e0e0}.message-created-by{font-weight:400;font-size:.82em;color:#888;margin-top:5px;margin-bottom:3px;margin-left:45px}.message-created{font-size:.82em;color:#495057;margin-top:0;margin-bottom:0;display:inline-block}.message-own .message-created{padding-left:10px;padding-right:6px}.message-from .message-created{padding-right:10px;padding-left:6px}.message-content{margin-top:3px;margin-bottom:6px;line-height:20px;position:relative;color:#000}.message-content i{display:none}.message-content:hover i{display:block}.message-content:hover{padding-right:20px!important}.chat-box-content{max-height:500px}.attachment-list .attachment-item{float:left;width:84px;height:84px;margin:8px;position:relative;overflow:hidden;background:#f1f1f1;border-radius:8px;text-align:center;border:1px solid #ccc;box-shadow:1px 2px 3px #0000000f;-webkit-user-select:none;user-select:none}.attachment-list .attachment-item img{width:100%;height:100%}.attachment-list .attachment-item span{position:absolute;top:25px;left:0;padding:5px;width:100%;word-break:break-all}.clearfix{clear:both}.dashboard .chat ul li img.message-img{height:120px;width:auto;margin-left:0;float:none}.message-attachment{cursor:pointer;position:relative;font-size:1.5em;margin:0 5px 0 0}.hidden{display:none}.message-input{width:100%}.message-input label{font-size:1.2rem}.remove-file-attachment{position:absolute;right:5px;top:5px;cursor:pointer;color:#fff;font-size:20px;background:#495057;border-radius:50%}.attachment-list{position:absolute;bottom:51px;width:calc(100% + 30px);background:#fff;left:-15px;height:100px;display:none;box-shadow:0 -2px 3px -3px #00000036}.attachment-list.attached-file{display:block}.dashboard{margin-top:-5px;margin-bottom:-15px}.dashboard .timeline>.ui-g .ui-g-9 .event-text{white-space:nowrap;color:#555}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2{white-space:pre-wrap;text-align:justify;line-height:18px;padding-left:30px}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2 i{position:absolute;left:20px;margin-top:3px}.new-message{align-items:center;justify-content:center}.dashboard .chat .new-message{display:flex;border:0;text-align:left;margin:0;padding:0}.dashboard .chat .new-message i{color:#495057}.dashboard .chat .new-message .message-attachment{border:0}.dashboard .chat .new-message .button-send{display:inline-block;line-height:40px;position:relative}.dashboard .chat .new-message .button-send .p-button-label{text-align:center}.dashboard .chat .new-message .message-emotion{line-height:40px;display:inline-block;width:40px;height:100%;text-align:center}.dashboard .chat .new-message .message-emotion i{line-height:inherit;font-size:24px}.dashboard .chat .new-message .message-input{width:calc(100% - 155px)}.dashboard .chat ul li.message-from,.dashboard .chat ul li.message-own{padding:0}.dashboard .chat ul li.message-from>span{border-radius:2px 20px 20px 2px;background-color:#f0e3fd;border:0}.dashboard .chat ul li.message-from>.middle,.dashboard .chat ul li.message-from>.first{margin-left:45px!important}.dashboard .chat ul li.message-from>.last{margin-left:45px!important;border-radius:2px 20px 20px}.dashboard .chat ul li.message-from>img{margin-top:5px;width:36px;border-radius:50%;position:absolute}.dashboard .chat ul li.message-own>span{border-radius:20px 2px 2px 20px;background-color:#def6f8;border:0;text-align:right}.dashboard .chat ul li.message-own>span.sending{background-color:#eee}.dashboard .chat ul li.message-own>span.last{border-radius:20px 2px 20px 20px}.dashboard .chat ul li.message-own .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-right:0;padding-left:0}.dashboard .chat ul li.message-own .attachment span.attachment-item a{display:inline-block;cursor:pointer;font-weight:700;color:#555}.dashboard .chat ul li.message-own>div.file{border-radius:6px;background:#f1f1f1;display:inline-block;margin:1px;text-align:right;border:1px solid #e4e4e4;overflow:hidden}.dashboard .chat ul li.message-from .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-right:0;padding-left:0}.dashboard .chat ul li.message-from .attachment span.attachment-item a{display:inline-block;cursor:pointer;font-weight:700;color:#555}.dashboard .chat ul li.message-from .attachment span.attachment-item a img{margin-right:0}.dashboard .chat ul li.message-from>div.file{border-radius:6px;background:#f1f1f1;display:inline-block;margin:1px;text-align:left;border:1px solid #e4e4e4;overflow:hidden}.dashboard .chat ul li .attachment span.attachment-item a>i{padding-right:8px}.dashboard .chat ul li div.file p.attachment{display:inline-block;margin-bottom:5px}.dashboard .chat ul li.message-from{text-align:left}.dashboard .chat ul li.message-own{text-align:right}.dashboard .chat ul li>div.file.image{height:170px;width:220px;transition:width .15s linear;padding:15px;max-width:100%}.dashboard .chat ul li>div.file.image p.attachment{height:120px}.dashboard .chat ul li>div.file{padding:15px}.dashboard .chat ul li>div.file p,.dashboard .chat ul li>div.file span{display:inline-block;padding:0;margin:0}.visible{visibility:visible;opacity:1;transition:opacity .15s linear}.hidden{visibility:hidden;opacity:0;transition:visibility 0s .1s,opacity .1s linear}.visible2{visibility:visible;opacity:1;transition:opacity .35s linear}.hidden2{visibility:hidden;opacity:0;transition:visibility 0s .3s,opacity .3s linear}.dashboard .chat{position:relative}.dashboard .chat .scroll-to-bottom{position:sticky;bottom:6px;text-align:right;padding-right:12px;min-height:40px}.dashboard .chat .scroll-to-bottom span{cursor:pointer;font-size:20px;color:#fff;background:#495057;box-shadow:0 0 10px #00000059;border:2px solid #fff;border-radius:50%;width:35px;height:35px;display:inline-block;line-height:35px;text-align:center;overflow:hidden}.dashboard .chat .group-info{position:sticky;top:0;background:#fff;margin:-10px;box-shadow:0 0 3px -1px #00000036;z-index:99;line-height:30px;padding:5px 10px}.dashboard .chat .pin{position:sticky;top:40px;z-index:98;background:#fff;margin-left:-10px;margin-bottom:10px;width:calc(100% + 20px);box-shadow:0 0 3px -1px #00000036}.dashboard .chat ul li.message-own.pin>span,.dashboard .chat ul li.message-from.pin>span{background-color:transparent}.dashboard .chat ul li.message-from.pin>span{margin-left:0}.dashboard .chat .message-content i{color:#495057;font-size:11px;cursor:pointer}.dashboard .chat .pin .message-content i{display:block}.dashboard .chat li.message-from .message-content{padding-left:6px}.dashboard .chat li.message-from .message-content i{padding:5px}.dashboard .chat li.message-own .message-content i{position:absolute;right:-15px;padding:5px}.dashboard .chat .group-info .circleButton{float:right;margin-top:0;margin-bottom:0}.dashboard .chat ul{margin-top:20px;padding:0}.dashboard .chat .new-message .message-input input.ui-inputtext:focus{outline:none;box-shadow:none}.dashboard .chat ul.hasPin{margin-top:10px}.dashboard .chat .group-info a{color:#495057}.normalHtml,.normalHtml strong,.normalHtml b{font-weight:400}.normalHtml{display:inline-block}.avatar-viewer .profile-image{width:40px;height:40px;margin-top:-6px;border:1px solid #fff;border-radius:50%}a.button>i{margin-right:5px}.dashboard .timeline{padding-top:20px}.ui-inputgroup .ui-inputtext{padding-right:0}.new-message .ui-inputtext{width:100%}.full-screen,.full-screen>.p-dialog{height:100%!important;top:0!important;width:100%!important;left:0!important;max-height:100%;min-width:100%!important;min-height:unset!important}#image-view-list.image-gallery-2{height:calc(100vh - 41px);width:100%;margin:-14px auto 0;background-color:#0006;touch-action:none}#image-view-list.image-gallery-2 .image-container{bottom:0;border:0;height:85%;margin:auto;background-color:transparent}#image-view-list.image-gallery-2 .image-container .iv-snap-view{top:auto;bottom:20px;left:calc(50% - 75px)}#image-view-list.image-gallery-2 .image-container .iv-image-view img{touch-action:auto}#image-view-list .inline-icon{margin-top:-41px}#image-view-list .footer-info,#image-view-list .material-icons.prev,#image-view-list .material-icons.next{display:none}#image-view-list .options-image-viewer{margin-right:37px;-webkit-user-select:none;user-select:none}.mobile-image-viewer-close{color:#fff;position:absolute;top:0;right:0;height:42px;width:37px;text-align:center;vertical-align:middle;line-height:42px;font-size:x-large;padding-right:7px;padding-top:2px;cursor:pointer}.mobile-image-viewer-close:hover{color:#feca37!important}.hide-holder{padding:0}.file-ex-name{word-break:break-all}.box-function{padding:8px 30px;text-align:right;width:100%;border-top:1px solid #e8e8e8;left:0;position:absolute;bottom:0;background:#fff;border-radius:0 0 5px 5px}.box-function button{margin-left:5px}.quick-note-button-holder{display:none;position:absolute;bottom:40px;right:50px;height:50px;width:50px;z-index:99}.quick-note-button{display:block;font-size:2em;color:#fff;outline:none;height:50px;width:50px;border-radius:50%;background:#ffc107;box-shadow:0 2px 5px #b9b9b9;line-height:50px;text-align:center;border:2px solid #fff}.quick-note-button:hover{color:#fff}.all-note-button{position:absolute;right:5px;top:5px;display:block;font-size:1.5em;color:#fff;outline:none;height:40px;width:40px;border-radius:50%;background:#ffd24b;box-shadow:0 2px 5px #b9b9b9;line-height:40px;text-align:center;border:2px solid #fff;transition:right;transition-duration:.16s;transition-timing-function:ease-in;z-index:-1}.all-note-button:hover{color:#fff}.setting-note-button{top:5px;position:absolute;right:5px;display:block;font-size:1.5em;color:#fff;outline:none;height:40px;width:40px;border-radius:50%;background:#ffd24b;box-shadow:0 2px 5px #b9b9b9;line-height:40px;text-align:center;border:2px solid #fff;transition:right;transition-duration:.16s;transition-timing-function:ease-in;z-index:-1}.setting-note-button:hover{color:#fff}.pinned-notes-holder{display:none;position:absolute;bottom:20px;left:20px;width:250px;z-index:98}.pinned-notes{display:block;outline:none;background:transparent;padding:0}.pinned-notes-header{font-size:1rem;font-weight:700}.pinned-notes-setting{position:absolute;right:.5rem}.pinned-note{font-size:.8rem;box-shadow:1px 2px 3px #b98b06a1;padding:0;margin-bottom:10px;background-color:#fff1ac;position:relative}.pinned-note:last-child{margin-bottom:0}.pinned-notes-minimize-button{padding-top:5px;width:25px;height:25px;text-align:center;position:absolute;right:-15px;top:-15px;background:#ffc003;box-shadow:1px 2px 3px #b98b06a1;border-radius:50%;cursor:pointer;color:#fff;border:1px solid #fff;z-index:1}.pinned-note-header-line{position:absolute;left:3px;width:13px;box-shadow:1px 1px 2px #0006;border:1px solid #fff;margin-bottom:.5rem;margin-top:.5rem;height:calc(100% - 1rem);max-height:20px}.pinned-note-header-right{cursor:pointer;float:right;margin-left:3px;width:32px}.pinned-note-header-time{font-size:.6rem}.pinned-note-header-button-unpin{opacity:.8;display:none;width:14px;height:14px;float:left;margin-right:2px}.pinned-note-header-button-complete{padding-top:2px;display:none}.pinned-note-body{float:right;width:100%;padding:.5rem .5rem .5rem 25px}.pinned-note-body:hover{background-color:#feeb82}.pinned-note-body:hover .pinned-note-header-time{display:none}.pinned-note-body:hover .pinned-note-header-button-unpin,.pinned-note-body:hover .pinned-note-header-button-complete{display:block}.pinned-note-line-title{display:block;font-weight:700;padding-bottom:6px;color:#333}.pinned-note-line{display:block}.view-port{position:absolute;display:none;height:0;width:0;background:transparent;z-index:999;box-shadow:0 0 0 9999px #00000096;border-radius:5px}.view-port-mask{position:absolute;display:block;height:100%;width:100%;top:0;left:0;background:transparent;z-index:9998}.tinymce-control{width:100%;border:1px solid #ccc;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;display:none}.input-tab-trap{opacity:0!important;filter:alpha(opacity=0)!important;width:0!important;overflow:hidden!important}.color-value input{font-size:.8em;line-height:16px}.dialog-material.mobile{width:100%!important}video,video:focus,audio,audio:focus{outline:none}.iv-image-view img.iv-image{animation:fadein .5s;visibility:hidden!important}@keyframes fadein{0%{opacity:0}to{opacity:1}}.iv-image-view img.iv-image.show{visibility:visible!important}.row-line{padding-top:0;padding-bottom:0}.fc-ltr{padding-bottom:7px}.padding-bottom-5px{padding-bottom:5px}.no-margin{margin:0!important}.no-padding{padding:0}.no-padding-left{padding-left:0}.float-left{float:left}body .fc .fc-toolbar .fc-button{color:#fff;background-color:#007ad9;border:1px solid #007ad9;font-size:14px;transition:background-color .2s,box-shadow .2s;border-radius:3px}body .fc .fc-toolbar .fc-button:enabled:hover{background-color:#116fbf;color:#fff;border-color:#116fbf}body .fc .fc-toolbar .fc-button:focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2em #8dcdff}body .fc .fc-toolbar .fc-button-group .fc-button{border-radius:0}body .fc .fc-toolbar .fc-button-group .fc-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}body .fc .fc-toolbar .fc-button-group .fc-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}body .fc .fc-toolbar .fc-right .fc-button{border-radius:0}body .fc .fc-toolbar .fc-right .fc-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}body .fc .fc-toolbar .fc-right .fc-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fc-toolbar>*>:not(:first-child){margin-left:0}.old-content,.fc-axis,.fc-timeGridDay-button,.fc-timeGridWeek-button,.fc-dayGridMonth-button{text-indent:-9999px;line-height:0}.new-content,.fc-axis:after,.fc-timeGridDay-button:after,.fc-timeGridWeek-button:after,.fc-dayGridMonth-button:after{text-indent:0;display:block;line-height:initial}.fc-dayGridMonth-button:after{content:\"Th\\e1ng\";padding:.2em}.fc-timeGridWeek-button:after{content:\"Tu\\1ea7n\";padding:.2em}.fc-timeGridDay-button:after{content:\"Ng\\e0y\";padding:.2em}body .fc th{background-color:#f4f4f4;border:1px solid #c8c8c8;color:#333;padding:.571em 1em}.ui-fluid .button-group p-button,.ui-fluid .button-group button{margin-right:.5em!important;width:auto;text-align:left}.layout-wrapper .layout-menu-container{z-index:97}.base-status,.base-status-immediately,.base-status-urgent,.base-status-high,.base-status-medium,.base-status-low,.base-status-ended,.base-status-aborted,.base-status-completed,.base-status-rejected,.base-status-returned,.base-status-approved,.base-status-pending,.base-status-on-conducting,.base-status-on-going,.base-status-create-new{padding:3px;border-radius:.25em;color:#fff;font-size:.8em;text-align:center}.base-status-create-new{color:#666;background-color:#f2f2f2}.base-status-on-going,.base-status-on-conducting{background-color:#337ab7}.base-status-pending{background-color:#ffba01}.base-status-approved{background-color:#34a835}.base-status-returned{background-color:#ffba01}.base-status-rejected{background-color:#d9534f}.base-status-completed{background-color:#34a835}.base-status-aborted{background-color:#ffba01}.base-status-ended{background-color:#34a835}.base-status-low,.base-status-medium{color:#666;background-color:#f2f2f2}.base-status-high{background-color:#ffba01}.base-status-urgent,.base-status-immediately{background-color:#d9534f}.text-align-center{text-align:center}.font-weight-bold{font-weight:700}.landing-body .landing-menu li a:hover{border-bottom:none}.landing-body .landing-menu li:first-child{margin-left:8px}.crud-form .label-control p{margin:0;padding:0}.crud-form .tn-check-box-list .p-row{display:block;padding:.5em;width:100%}.crud-form tn-mask,.crud-form dropdown{width:100%}.crud-form .tn-dropdown{min-height:32px}.crud-form .tn-dropdown.free-text.horizontal{display:flex}.crud-form .tn-dropdown.free-text.horizontal>div{flex-grow:1;padding-left:.5em;padding-right:.5em}.crud-form .tn-dropdown.free-text.horizontal>div:first-child{padding-left:0}.crud-form .tn-dropdown.free-text.horizontal>div:last-child{padding-right:0}.crud-form .tn-dropdown.free-text.vertical input.ui-inputtext.input-free-text{margin-top:.5em}.crud-form.assessment .label-control{font-weight:700}.crud-form.assessment .label-control.haveIndex{position:relative;padding-left:20px;margin-bottom:5px;display:block}.crud-form.assessment .label-control.haveIndex:before{content:\" \" attr(label-index) \".\";position:absolute;left:0;top:0}.crud-form.assessment .ViewMode{border-bottom:none}.crud-form.assessment .ViewMode .label-control{margin-bottom:0}body .ui-inputtext.min-width{padding:6px}.ps__rail-x,.ps__rail-y{z-index:2}.zIndex5 .ps__rail-x,.zIndex5 .ps__rail-y{z-index:5}.table-sticky table{border-collapse:separate;border-spacing:0}.table-sticky tr th,.table-sticky tr td{border:none!important;border-right:1px solid #eee!important;border-bottom:1px solid #eee!important}.table-sticky tr th:first-child,.table-sticky tr td:first-child{border-left:1px solid #eee!important}.table-sticky tr th:last-child,.table-sticky tr td:last-child{border-right:none!important}.table-sticky tr:first-child th{border-top:1px solid #eee!important}.table-sticky th{background:#eee}.table-sticky tbody td.disabled{background:#eee!important}.table-sticky tbody td.disabled:not(:last-child){border-right:1px solid white!important}.table-sticky.fix-height tr:first-child th{position:sticky;top:0;z-index:2}.container-flex{display:flex;align-items:center}.container-flex>div:first-child{flex:0 0 auto;margin-right:.5em}.container-flex>div:last-child{flex-grow:1}.container-control{display:flex}.container-control>span.label{flex:0 0 auto;padding-top:.5em;padding-right:.5em}.container-control>span.label+*{flex-grow:1;flex-shrink:1;position:relative}.container-control>span.label+* .tn-dropdown,.container-control>span.label+* .ui-autocomplete-multiple,.container-control>span.label+* .ui-inputgroup .ui-inputtext{width:100%}.container-control>span.label+* .validation-container{margin-top:3px}.container-control>span.label+* .validation-container .validate-item{white-space:unset}.container-control>span.label+*>div{position:absolute;left:0;top:0;width:100%}.container-control.no-label>span.label{display:none}.container-control.inline{display:inline-flex}.align-flex-center{display:flex;justify-content:center;align-items:center}@media print{.isPrinting>*{display:none}.isPrinting app-print-layout{display:block}}.layout-wrapper .topbar .topbar-left,.layout-wrapper .topbar .topbar-right{background:#397ac3}#searchResultPanel-holder{padding:0 .5em}.cus-dropdown{line-height:initial;margin-right:1em}.tn-thumbnail{padding:.5rem}.tn-thumbnail.tn-thumbnail.tn-thumbnail{box-sizing:border-box}.fa-10:before{content:\"A+\";font-weight:700;font-family:cursive}.layout-wrapper .topbar .topbar-right #menu-button i{font-size:20px;margin-top:4px}.layout-wrapper .layout-menu li a i.menuitem-toggle-icon{font-size:15px;margin-left:auto}.flex-container-main-content{display:flex;flex-direction:column}.flex-container-main-content>div:last-child{background-color:#f4f4f4;flex:1 1;display:flex;overflow:hidden;position:relative}.flex-container-main-content>div:last-child>div{padding-top:.5em;overflow:hidden;position:absolute;left:0;top:0;width:100%;height:100%}.flex-container-main-content .block-with-button-search{display:flex;justify-content:flex-end}.flex-container-main-content .block-with-button-search>*{margin-left:.5em}.flex-container-main-content .block-with-button-search>input{margin-left:0;max-width:200px;width:100%;height:26px}.flex-container-main-content .block-with-button-search>dropdown{max-width:140px;width:100%}.flex-container-main-content .title-main-component{border-bottom:2px solid #1ca7ff}.clickable-table.clickable-table{cursor:pointer}.main-crud-container{height:calc(100vh - 76px)}.flex-container-fit-child{display:flex;flex-direction:column;height:100%;overflow:hidden}.flex-container-fit-child>div.fit-content{flex:1 1;position:relative}.flex-container-fit-child>div.fit-content>div{position:absolute;height:100%;width:100%;overflow:auto}.waiting-box{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;display:none}.waiting-box .overlay{background-color:red;background-color:#6d6d6d80;width:100%;height:100%}.waiting-box .content-loading{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.waiting-box.show{display:block}.function-topbar>*{vertical-align:top}.function-topbar button{width:auto}.function-topbar p-fileUpload{margin-right:1em}.function-topbar .container-control{display:inline-flex;line-height:initial}.function-topbar .container-control dropdown{width:100%}*:focus{outline-color:#a6d5fa!important}address{font-style:normal}body .p-toast .p-toast-message{border-radius:0;border-width:0 0 0 4px!important}.status span,.__status span{font-size:.8rem}p-table.single-check .p-datatable .p-datatable-tbody>tr{cursor:pointer}p-table.single-check .p-datatable .p-datatable-tbody>tr.p-state-highlight{background:#e3f2fd!important;outline:2px solid #a6d5fa}p-table.single-check .p-datatable .p-datatable-tbody>tr td.sticky .fix-sticky.top{display:none}p-table.multi-check .p-datatable .p-datatable-tbody>tr.p-state-highlight{background:#e3f2fd!important}p-table.multi-check .p-datatable .p-datatable-tbody>tr.p-state-highlight td{border-color:#fff}p-table.multi-check .p-datatable .p-datatable-tbody>tr.p-state-highlight td .fix-sticky{background-color:#fff}.tn-animated-right-arrow-icon,.tn-animated-left-arrow-icon{height:32px;width:14px;position:relative;z-index:10}.tn-animated-right-arrow-icon{animation:arrowBounceToRight .8s ease-in-out infinite alternate}.tn-animated-left-arrow-icon{animation:arrowBounceToLeft .8s ease-in-out infinite alternate}.tn-animated-right-arrow-icon:before,.tn-animated-left-arrow-icon:before,.tn-animated-right-arrow-icon:after,.tn-animated-left-arrow-icon:after{content:\"\";position:absolute;background-color:#88b0dd;width:5px;height:20px;display:block}.tn-animated-right-arrow-icon:before{left:4px;top:0;transform:rotate(-35deg)}.tn-animated-right-arrow-icon:after{left:4px;top:14px;transform:rotate(35deg)}.tn-animated-left-arrow-icon:before{right:4px;top:0;transform:rotate(35deg)}.tn-animated-left-arrow-icon:after{right:4px;top:14px;transform:rotate(-35deg)}@keyframes arrowBounceToLeft{0%{transform:translate(-3px)}to{transform:translate(3px)}}@keyframes arrowBounceToRight{0%{transform:translate(3px)}to{transform:translate(-3px)}}.pass{color:#49c949;margin:5px;text-align:center}.not-pass{color:red;margin:5px;text-align:center}\n"], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i11.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i12.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i13.FileViewerComponent, selector: "file-viewer", inputs: ["model", "readonly", "showPrint", "showDownload", "showDelete"], outputs: ["onClose", "onRename", "onDelete"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.DatePipe, name: "date" }, { kind: "pipe", type: i14.SecurePipe, name: "secure" }] });
586
+ ChatBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: ChatBoxComponent, selector: "chat-box", inputs: { taskId: "taskId", serviceCode: "serviceCode", entity: "entity", users: "users", showSendMessageBox: "showSendMessageBox" }, providers: [ComponentContextService, CheckControlVisibleService], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "fileElement", first: true, predicate: ["fileElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"dashboard\">\r\n <div class=\"chat\">\r\n <div class=\"group-info\">\r\n <a href=\"javascript:\">C\u00F3 {{peopleAll.length}} ng\u01B0\u1EDDi trong nh\u00F3m n\u00E0y</a>\r\n <div class=\"circleButton\" pTooltip=\"Xem to\u00E0n b\u1ED9 \u0111\u00EDnh k\u00E8m\" tooltipPosition=\"top\">\r\n <a href=\"javascript:\"><i class=\"far fa-images\"></i></a>\r\n </div>\r\n <div (click)=\"addPeople()\" class=\"circleButton\" pTooltip=\"Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi v\u00E0o nh\u00F3m\" tooltipPosition=\"top\"\r\n disabled=\"true\">\r\n <a href=\"javascript:\"><i class=\"fas fa-user-plus\"></i></a>\r\n </div>\r\n </div>\r\n <ul #scrollMe [ngClass]=\"{'hasPin': model.pinnedMessage != null}\">\r\n <li *ngIf=\"model.pinnedMessage\" class=\"clearfix pin\" [ngClass]=\"{'message-from': true}\">\r\n <ng-container\r\n *ngTemplateOutlet=\"messageItem; context: { i : -1, item: model.pinnedMessage, isPinnedMessage: true}\">\r\n </ng-container>\r\n </li>\r\n <li *ngFor=\"let item of model.dataSource; let i = index; trackBy: trackByFunc\" class=\"clearfix\"\r\n [ngClass]=\"{ 'message-own': item.type == 'own'}\">\r\n <ng-container *ngTemplateOutlet=\"messageItem; context: { i : i, item: item}\">\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <!-- <chat-send-message-box *ngIf=\"showSendMessageBox\"></chat-send-message-box>-->\r\n <div [ngClass]=\"{'visible2': model.scrolling, 'hidden2': !model.scrolling}\" class=\"scroll-to-bottom\">\r\n <span *ngIf=\"model.newMessageNotUpdatedCount > 0\" (click)=\"scrollToBottom(350, true, null)\">\r\n {{model.newMessageNotUpdatedCount <= 5 ? model.newMessageNotUpdatedCount : '5+' }} </span>\r\n <span (click)=\"scrollToBottom(350, true, null)\" *ngIf=\"model.newMessageNotUpdatedCount == 0\">\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<file-viewer *ngIf=\"fileViewerModel.showEditForm\" [parentContext]=\"context\" [parentModel]=\"model\"\r\n [model]=\"fileViewerModel\">\r\n</file-viewer>\r\n\r\n<ng-template #messageItem let-i=\"i\" let-isPinnedMessage=\"isPinnedMessage\" let-item=\"item\">\r\n <img *ngIf=\"item.isFirstMessageFlow && item.type != 'own' && !isPinnedMessage && item.avatar != null\" alt=\"\"\r\n class=\"chat-avatar\" src=\"{{getCurrentUserAvatar(item.avatar)}}\">\r\n <p *ngIf=\"(item.isFirstMessageFlow && item.type != 'own') && !isPinnedMessage\" class=\"message-created-by\">\r\n {{item.fullName}}\r\n </p>\r\n <span *ngIf=\"!hasAttachment(item)\">\r\n <!-- [class]=\"addClassToMessage(item, isPinnedMessage)\">-->\r\n <p *ngIf=\"!hasAttachment(item)\" class=\"message-content\">\r\n <i (click)=\"pinMessage(item)\" class=\"fas fa-thumbtack\" style=\"right: 0;\"></i>\r\n <i (click)=\"quickNote(item)\" class=\"fas fa-sticky-note\"></i>\r\n {{item.content}}\r\n </p>\r\n <p *ngIf=\"!isPinnedMessage && (item.isLastMessageFlow || !inTheSameTime(i, item, model.dataSource))\"\r\n class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n <p *ngIf=\"isPinnedMessage\" class=\"message-created\">\r\n {{item.createdBy}} \u0111\u00E3 g\u1EEDi l\u00FAc {{item.created | date:'dd/MM/yyyy HH:mm'}}\r\n </p>\r\n </span>\r\n <ng-container *ngIf=\"hasAttachment(item)\">\r\n <ng-container *ngFor=\"let attachmentItem of item.attachments;let index=index\">\r\n <div class=\"file\"\r\n [ngClass]=\"{'first':item.isFirstMessageFlow && index == 0, 'middle':index > 0 || !item.isFirstMessageFlow, 'image' : attachmentItem.type == 'image'}\"\r\n [ngStyle]=\"{'width': model.img[i + 'width' + index]}\">\r\n <p class=\"attachment\">\r\n <span (mouseup)=\"onMouseUp($event)\" class=\"attachment-item\">\r\n <a *ngIf=\"attachmentItem.type != 'image'\" (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <i class=\"fas fa-paperclip\"></i>{{attachmentItem.fileName}}\r\n </a>\r\n <a *ngIf=\"attachmentItem.type == 'image'\" #aElement\r\n [ngClass]=\"{'hidden': !model.img[i + '' + index], 'visible':model.img[i + '' + index]}\"\r\n (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <img class=\"message-img\" (load)=\"loadImg($event, i, index)\"\r\n [src]=\"attachmentItem.url | secure | async\" />\r\n </a>\r\n </span>\r\n </p>\r\n <div style=\"clear: both\"></div>\r\n <p class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n </div>\r\n <div style=\"clear: both\"></div>\r\n </ng-container>\r\n </ng-container>\r\n <after-view-checked *ngIf=\"model.dataSource.length == i + 1\" (loading)=\"scrollToBottom(0, false, item.sent)\">\r\n </after-view-checked>\r\n</ng-template>\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\"-->\r\n<!-- (onCancel)=\"userPickerForm.show = false\"-->\r\n<!-- (onHide)=\"userPickerForm.show = false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n<!-- <user-picker-box #formBase [control]=\"userPickerControl\"-->\r\n<!-- [(ngModel)]=\"this.peopleAll\" [multiple]=\"userPickerControl.multiple\">-->\r\n<!-- </user-picker-box>-->\r\n<!--</tn-dialog>-->\r\n\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\" (onHide)=\"userPickerForm.show == false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n\r\n<!-- &lt;!&ndash;<quick-add-form *ngIf=\"model.editFormModel.showQuickNoteForm\" [parentContext]=\"context\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; [parentModel]=\"context.data.noteDataModel\"></quick-add-form>&ndash;&gt;-->\r\n<!--</tn-dialog>-->", styles: [".paging-advance{list-style:none;padding-left:0;margin:3px 0}.paging-advance li{width:150px;padding-left:15px;line-height:30}.paging-advance li.disabled{color:#bdbdbd;outline:none}.paging-advance li.disabled:hover{cursor:default;background:none}.paging-advance li:hover{cursor:pointer;background:red}.paging-advance-overlay .ui-overlaypanel-content{padding:0}.paging-advance-overlay.ui-overlaypanel-shifted:before{right:auto;left:1.25em;margin-left:-10}.paging-advance-overlay.ui-overlaypanel-shifted:after{right:auto;left:1.25em;margin-left:-8px}.chat-avatar{height:36px;border:2px solid #eee}\n", ""], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i11.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i12.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i13.FileViewerComponent, selector: "file-viewer", inputs: ["model", "readonly", "showPrint", "showDownload", "showDelete"], outputs: ["onClose", "onRename", "onDelete"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.DatePipe, name: "date" }, { kind: "pipe", type: i14.SecurePipe, name: "secure" }] });
588
587
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ChatBoxComponent, decorators: [{
589
588
  type: Component,
590
- args: [{ selector: 'chat-box', providers: [ComponentContextService, CheckControlVisibleService], template: "<div class=\"dashboard\">\r\n <div class=\"chat\">\r\n <div class=\"group-info\">\r\n <a href=\"javascript:\">C\u00F3 {{peopleAll.length}} ng\u01B0\u1EDDi trong nh\u00F3m n\u00E0y</a>\r\n <div class=\"circleButton\" pTooltip=\"Xem to\u00E0n b\u1ED9 \u0111\u00EDnh k\u00E8m\" tooltipPosition=\"top\">\r\n <a href=\"javascript:\"><i class=\"far fa-images\"></i></a>\r\n </div>\r\n <div (click)=\"addPeople()\" class=\"circleButton\" pTooltip=\"Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi v\u00E0o nh\u00F3m\" tooltipPosition=\"top\"\r\n disabled=\"true\">\r\n <a href=\"javascript:\"><i class=\"fas fa-user-plus\"></i></a>\r\n </div>\r\n </div>\r\n <ul #scrollMe [ngClass]=\"{'hasPin': model.pinnedMessage != null}\">\r\n <li *ngIf=\"model.pinnedMessage\" class=\"clearfix pin\" [ngClass]=\"{'message-from': true}\">\r\n <ng-container\r\n *ngTemplateOutlet=\"messageItem; context: { i : -1, item: model.pinnedMessage, isPinnedMessage: true}\">\r\n </ng-container>\r\n </li>\r\n <li *ngFor=\"let item of model.dataSource; let i = index; trackBy: trackByFunc\" class=\"clearfix\"\r\n [ngClass]=\"{ 'message-own': item.type == 'own'}\">\r\n <ng-container *ngTemplateOutlet=\"messageItem; context: { i : i, item: item}\">\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <!-- <chat-send-message-box *ngIf=\"showSendMessageBox\"></chat-send-message-box>-->\r\n <div [ngClass]=\"{'visible2': model.scrolling, 'hidden2': !model.scrolling}\" class=\"scroll-to-bottom\">\r\n <span *ngIf=\"model.newMessageNotUpdatedCount > 0\" (click)=\"scrollToBottom(350, true, null)\">\r\n {{model.newMessageNotUpdatedCount <= 5 ? model.newMessageNotUpdatedCount : '5+' }} </span>\r\n <span (click)=\"scrollToBottom(350, true, null)\" *ngIf=\"model.newMessageNotUpdatedCount == 0\">\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<file-viewer *ngIf=\"fileViewerModel.showEditForm\" [parentContext]=\"context\" [parentModel]=\"model\"\r\n [model]=\"fileViewerModel\">\r\n</file-viewer>\r\n\r\n<ng-template #messageItem let-i=\"i\" let-isPinnedMessage=\"isPinnedMessage\" let-item=\"item\">\r\n <img *ngIf=\"item.isFirstMessageFlow && item.type != 'own' && !isPinnedMessage && item.avatar != null\" alt=\"\"\r\n class=\"chat-avatar\" src=\"{{getCurrentUserAvatar(item.avatar)}}\">\r\n <p *ngIf=\"(item.isFirstMessageFlow && item.type != 'own') && !isPinnedMessage\" class=\"message-created-by\">\r\n {{item.fullName}}\r\n </p>\r\n <span *ngIf=\"!hasAttachment(item)\">\r\n <!-- [class]=\"addClassToMessage(item, isPinnedMessage)\">-->\r\n <p *ngIf=\"!hasAttachment(item)\" class=\"message-content\">\r\n <i (click)=\"pinMessage(item)\" class=\"fas fa-thumbtack\" style=\"right: 0;\"></i>\r\n <i (click)=\"quickNote(item)\" class=\"fas fa-sticky-note\"></i>\r\n {{item.content}}\r\n </p>\r\n <p *ngIf=\"!isPinnedMessage && (item.isLastMessageFlow || !inTheSameTime(i, item, model.dataSource))\"\r\n class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n <p *ngIf=\"isPinnedMessage\" class=\"message-created\">\r\n {{item.createdBy}} \u0111\u00E3 g\u1EEDi l\u00FAc {{item.created | date:'dd/MM/yyyy HH:mm'}}\r\n </p>\r\n </span>\r\n <ng-container *ngIf=\"hasAttachment(item)\">\r\n <ng-container *ngFor=\"let attachmentItem of item.attachments;let index=index\">\r\n <div class=\"file\"\r\n [ngClass]=\"{'first':item.isFirstMessageFlow && index == 0, 'middle':index > 0 || !item.isFirstMessageFlow, 'image' : attachmentItem.type == 'image'}\"\r\n [ngStyle]=\"{'width': model.img[i + 'width' + index]}\">\r\n <p class=\"attachment\">\r\n <span (mouseup)=\"onMouseUp($event)\" class=\"attachment-item\">\r\n <a *ngIf=\"attachmentItem.type != 'image'\" (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <i class=\"fas fa-paperclip\"></i>{{attachmentItem.fileName}}\r\n </a>\r\n <a *ngIf=\"attachmentItem.type == 'image'\" #aElement\r\n [ngClass]=\"{'hidden': !model.img[i + '' + index], 'visible':model.img[i + '' + index]}\"\r\n (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <img class=\"message-img\" (load)=\"loadImg($event, i, index)\"\r\n [src]=\"attachmentItem.url | secure | async\" />\r\n </a>\r\n </span>\r\n </p>\r\n <div style=\"clear: both\"></div>\r\n <p class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n </div>\r\n <div style=\"clear: both\"></div>\r\n </ng-container>\r\n </ng-container>\r\n <after-view-checked *ngIf=\"model.dataSource.length == i + 1\" (loading)=\"scrollToBottom(0, false, item.sent)\">\r\n </after-view-checked>\r\n</ng-template>\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\"-->\r\n<!-- (onCancel)=\"userPickerForm.show = false\"-->\r\n<!-- (onHide)=\"userPickerForm.show = false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n<!-- <user-picker-box #formBase [control]=\"userPickerControl\"-->\r\n<!-- [(ngModel)]=\"this.peopleAll\" [multiple]=\"userPickerControl.multiple\">-->\r\n<!-- </user-picker-box>-->\r\n<!--</tn-dialog>-->\r\n\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\" (onHide)=\"userPickerForm.show == false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n\r\n<!-- &lt;!&ndash;<quick-add-form *ngIf=\"model.editFormModel.showQuickNoteForm\" [parentContext]=\"context\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; [parentModel]=\"context.data.noteDataModel\"></quick-add-form>&ndash;&gt;-->\r\n<!--</tn-dialog>-->", styles: [".paging-advance{list-style:none;padding-left:0;margin:3px 0}.paging-advance li{width:150px;padding-left:15px;line-height:30}.paging-advance li.disabled{color:#bdbdbd;outline:none}.paging-advance li.disabled:hover{cursor:default;background:none}.paging-advance li:hover{cursor:pointer;background:red}.paging-advance-overlay .ui-overlaypanel-content{padding:0}.paging-advance-overlay.ui-overlaypanel-shifted:before{right:auto;left:1.25em;margin-left:-10}.paging-advance-overlay.ui-overlaypanel-shifted:after{right:auto;left:1.25em;margin-left:-8px}.chat-avatar{height:36px;border:2px solid #eee}\n", "@charset \"UTF-8\";@import\"~@angular/material/prebuilt-themes/indigo-pink.css\";@import\"~jsoneditor/dist/jsoneditor.min.css\";.flex{display:flex}.flex .fit{flex:1 1}.flex.flex-column{flex-direction:column}.flex.flex-wrap{flex-wrap:wrap}.flex.center-v{align-items:center}.flex.center-h{justify-content:center}.flex.center-all{align-items:center;justify-content:center}.validate-item{color:#e00000;display:inline-block;font-size:.9em;white-space:nowrap;background-color:#fff}.tn-scroll-bar.bgWhite>div{background-color:#fff}.label-primary{padding:2px;border-radius:.25em;background-color:#1ab394;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.label-danger{padding:2px 5px;border-radius:.25em;background-color:#ed5565;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.label-warning{padding:2px;border-radius:.25em;background-color:#b8860b;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.label-secondary{padding:2px;border-radius:.25em;background-color:#a9a9a9;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.label-done{padding:2px;border-radius:.25em;background-color:#3b1ef7;color:#fff;font-size:12px;margin-right:3px;margin-left:3px;min-width:60px;display:inline-block}.text-navy{color:#1ab394!important}.text-danger{color:red!important}.fa-user-edit{font-size:14px}.flexcolumn{max-height:calc(100vh - 180px);min-height:80px;overflow-y:hidden;overflow-x:hidden;border:1px solid #eee;border-radius:5px}.has2ScrollZone2 .flexcolumn{max-height:calc(100vh - 180px)}.headerNoBorder>th{border:none!important;border-bottom:1px solid #eee!important}.cellNoBorder table tr td{border:0!important}.layout-wrapper .layout-main{padding:60px 0 0;overflow:hidden}div.circleButton{line-height:32px;border-radius:50%;width:32px;height:32px;text-align:center;position:relative;display:inline-block;transform:perspective(1px);overflow:hidden;margin-top:4px;margin-bottom:4px}div.circleButton>a{padding:0!important;line-height:32px}div.circleButton>a>i{width:24px!important}div.circleButton:before{content:\"\";position:absolute;inset:0;background:#e6e6e6;z-index:-1;transform:scale(0);transition:all cubic-bezier(.4,.34,.01,.97) .3s;border-radius:50%}div.circleButton:hover:before{transform:scale(1)}.message-notice{text-align:center;background:#e0e0e0}.message-created-by{font-weight:400;font-size:.82em;color:#888;margin-top:5px;margin-bottom:3px;margin-left:45px}.message-created{font-size:.82em;color:#495057;margin-top:0;margin-bottom:0;display:inline-block}.message-own .message-created{padding-left:10px;padding-right:6px}.message-from .message-created{padding-right:10px;padding-left:6px}.message-content{margin-top:3px;margin-bottom:6px;line-height:20px;position:relative;color:#000}.message-content i{display:none}.message-content:hover i{display:block}.message-content:hover{padding-right:20px!important}.chat-box-content{max-height:500px}.attachment-list .attachment-item{float:left;width:84px;height:84px;margin:8px;position:relative;overflow:hidden;background:#f1f1f1;border-radius:8px;text-align:center;border:1px solid #ccc;box-shadow:1px 2px 3px #0000000f;-webkit-user-select:none;user-select:none}.attachment-list .attachment-item img{width:100%;height:100%}.attachment-list .attachment-item span{position:absolute;top:25px;left:0;padding:5px;width:100%;word-break:break-all}.clearfix{clear:both}.dashboard .chat ul li img.message-img{height:120px;width:auto;margin-left:0;float:none}.message-attachment{cursor:pointer;position:relative;font-size:1.5em;margin:0 5px 0 0}.hidden{display:none}.message-input{width:100%}.message-input label{font-size:1.2rem}.remove-file-attachment{position:absolute;right:5px;top:5px;cursor:pointer;color:#fff;font-size:20px;background:#495057;border-radius:50%}.attachment-list{position:absolute;bottom:51px;width:calc(100% + 30px);background:#fff;left:-15px;height:100px;display:none;box-shadow:0 -2px 3px -3px #00000036}.attachment-list.attached-file{display:block}.dashboard{margin-top:-5px;margin-bottom:-15px}.dashboard .timeline>.ui-g .ui-g-9 .event-text{white-space:nowrap;color:#555}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2{white-space:pre-wrap;text-align:justify;line-height:18px;padding-left:30px}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2 i{position:absolute;left:20px;margin-top:3px}.new-message{align-items:center;justify-content:center}.dashboard .chat .new-message{display:flex;border:0;text-align:left;margin:0;padding:0}.dashboard .chat .new-message i{color:#495057}.dashboard .chat .new-message .message-attachment{border:0}.dashboard .chat .new-message .button-send{display:inline-block;line-height:40px;position:relative}.dashboard .chat .new-message .button-send .p-button-label{text-align:center}.dashboard .chat .new-message .message-emotion{line-height:40px;display:inline-block;width:40px;height:100%;text-align:center}.dashboard .chat .new-message .message-emotion i{line-height:inherit;font-size:24px}.dashboard .chat .new-message .message-input{width:calc(100% - 155px)}.dashboard .chat ul li.message-from,.dashboard .chat ul li.message-own{padding:0}.dashboard .chat ul li.message-from>span{border-radius:2px 20px 20px 2px;background-color:#f0e3fd;border:0}.dashboard .chat ul li.message-from>.middle,.dashboard .chat ul li.message-from>.first{margin-left:45px!important}.dashboard .chat ul li.message-from>.last{margin-left:45px!important;border-radius:2px 20px 20px}.dashboard .chat ul li.message-from>img{margin-top:5px;width:36px;border-radius:50%;position:absolute}.dashboard .chat ul li.message-own>span{border-radius:20px 2px 2px 20px;background-color:#def6f8;border:0;text-align:right}.dashboard .chat ul li.message-own>span.sending{background-color:#eee}.dashboard .chat ul li.message-own>span.last{border-radius:20px 2px 20px 20px}.dashboard .chat ul li.message-own .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-right:0;padding-left:0}.dashboard .chat ul li.message-own .attachment span.attachment-item a{display:inline-block;cursor:pointer;font-weight:700;color:#555}.dashboard .chat ul li.message-own>div.file{border-radius:6px;background:#f1f1f1;display:inline-block;margin:1px;text-align:right;border:1px solid #e4e4e4;overflow:hidden}.dashboard .chat ul li.message-from .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-right:0;padding-left:0}.dashboard .chat ul li.message-from .attachment span.attachment-item a{display:inline-block;cursor:pointer;font-weight:700;color:#555}.dashboard .chat ul li.message-from .attachment span.attachment-item a img{margin-right:0}.dashboard .chat ul li.message-from>div.file{border-radius:6px;background:#f1f1f1;display:inline-block;margin:1px;text-align:left;border:1px solid #e4e4e4;overflow:hidden}.dashboard .chat ul li .attachment span.attachment-item a>i{padding-right:8px}.dashboard .chat ul li div.file p.attachment{display:inline-block;margin-bottom:5px}.dashboard .chat ul li.message-from{text-align:left}.dashboard .chat ul li.message-own{text-align:right}.dashboard .chat ul li>div.file.image{height:170px;width:220px;transition:width .15s linear;padding:15px;max-width:100%}.dashboard .chat ul li>div.file.image p.attachment{height:120px}.dashboard .chat ul li>div.file{padding:15px}.dashboard .chat ul li>div.file p,.dashboard .chat ul li>div.file span{display:inline-block;padding:0;margin:0}.visible{visibility:visible;opacity:1;transition:opacity .15s linear}.hidden{visibility:hidden;opacity:0;transition:visibility 0s .1s,opacity .1s linear}.visible2{visibility:visible;opacity:1;transition:opacity .35s linear}.hidden2{visibility:hidden;opacity:0;transition:visibility 0s .3s,opacity .3s linear}.dashboard .chat{position:relative}.dashboard .chat .scroll-to-bottom{position:sticky;bottom:6px;text-align:right;padding-right:12px;min-height:40px}.dashboard .chat .scroll-to-bottom span{cursor:pointer;font-size:20px;color:#fff;background:#495057;box-shadow:0 0 10px #00000059;border:2px solid #fff;border-radius:50%;width:35px;height:35px;display:inline-block;line-height:35px;text-align:center;overflow:hidden}.dashboard .chat .group-info{position:sticky;top:0;background:#fff;margin:-10px;box-shadow:0 0 3px -1px #00000036;z-index:99;line-height:30px;padding:5px 10px}.dashboard .chat .pin{position:sticky;top:40px;z-index:98;background:#fff;margin-left:-10px;margin-bottom:10px;width:calc(100% + 20px);box-shadow:0 0 3px -1px #00000036}.dashboard .chat ul li.message-own.pin>span,.dashboard .chat ul li.message-from.pin>span{background-color:transparent}.dashboard .chat ul li.message-from.pin>span{margin-left:0}.dashboard .chat .message-content i{color:#495057;font-size:11px;cursor:pointer}.dashboard .chat .pin .message-content i{display:block}.dashboard .chat li.message-from .message-content{padding-left:6px}.dashboard .chat li.message-from .message-content i{padding:5px}.dashboard .chat li.message-own .message-content i{position:absolute;right:-15px;padding:5px}.dashboard .chat .group-info .circleButton{float:right;margin-top:0;margin-bottom:0}.dashboard .chat ul{margin-top:20px;padding:0}.dashboard .chat .new-message .message-input input.ui-inputtext:focus{outline:none;box-shadow:none}.dashboard .chat ul.hasPin{margin-top:10px}.dashboard .chat .group-info a{color:#495057}.normalHtml,.normalHtml strong,.normalHtml b{font-weight:400}.normalHtml{display:inline-block}.avatar-viewer .profile-image{width:40px;height:40px;margin-top:-6px;border:1px solid #fff;border-radius:50%}a.button>i{margin-right:5px}.dashboard .timeline{padding-top:20px}.ui-inputgroup .ui-inputtext{padding-right:0}.new-message .ui-inputtext{width:100%}.full-screen,.full-screen>.p-dialog{height:100%!important;top:0!important;width:100%!important;left:0!important;max-height:100%;min-width:100%!important;min-height:unset!important}#image-view-list.image-gallery-2{height:calc(100vh - 41px);width:100%;margin:-14px auto 0;background-color:#0006;touch-action:none}#image-view-list.image-gallery-2 .image-container{bottom:0;border:0;height:85%;margin:auto;background-color:transparent}#image-view-list.image-gallery-2 .image-container .iv-snap-view{top:auto;bottom:20px;left:calc(50% - 75px)}#image-view-list.image-gallery-2 .image-container .iv-image-view img{touch-action:auto}#image-view-list .inline-icon{margin-top:-41px}#image-view-list .footer-info,#image-view-list .material-icons.prev,#image-view-list .material-icons.next{display:none}#image-view-list .options-image-viewer{margin-right:37px;-webkit-user-select:none;user-select:none}.mobile-image-viewer-close{color:#fff;position:absolute;top:0;right:0;height:42px;width:37px;text-align:center;vertical-align:middle;line-height:42px;font-size:x-large;padding-right:7px;padding-top:2px;cursor:pointer}.mobile-image-viewer-close:hover{color:#feca37!important}.hide-holder{padding:0}.file-ex-name{word-break:break-all}.box-function{padding:8px 30px;text-align:right;width:100%;border-top:1px solid #e8e8e8;left:0;position:absolute;bottom:0;background:#fff;border-radius:0 0 5px 5px}.box-function button{margin-left:5px}.quick-note-button-holder{display:none;position:absolute;bottom:40px;right:50px;height:50px;width:50px;z-index:99}.quick-note-button{display:block;font-size:2em;color:#fff;outline:none;height:50px;width:50px;border-radius:50%;background:#ffc107;box-shadow:0 2px 5px #b9b9b9;line-height:50px;text-align:center;border:2px solid #fff}.quick-note-button:hover{color:#fff}.all-note-button{position:absolute;right:5px;top:5px;display:block;font-size:1.5em;color:#fff;outline:none;height:40px;width:40px;border-radius:50%;background:#ffd24b;box-shadow:0 2px 5px #b9b9b9;line-height:40px;text-align:center;border:2px solid #fff;transition:right;transition-duration:.16s;transition-timing-function:ease-in;z-index:-1}.all-note-button:hover{color:#fff}.setting-note-button{top:5px;position:absolute;right:5px;display:block;font-size:1.5em;color:#fff;outline:none;height:40px;width:40px;border-radius:50%;background:#ffd24b;box-shadow:0 2px 5px #b9b9b9;line-height:40px;text-align:center;border:2px solid #fff;transition:right;transition-duration:.16s;transition-timing-function:ease-in;z-index:-1}.setting-note-button:hover{color:#fff}.pinned-notes-holder{display:none;position:absolute;bottom:20px;left:20px;width:250px;z-index:98}.pinned-notes{display:block;outline:none;background:transparent;padding:0}.pinned-notes-header{font-size:1rem;font-weight:700}.pinned-notes-setting{position:absolute;right:.5rem}.pinned-note{font-size:.8rem;box-shadow:1px 2px 3px #b98b06a1;padding:0;margin-bottom:10px;background-color:#fff1ac;position:relative}.pinned-note:last-child{margin-bottom:0}.pinned-notes-minimize-button{padding-top:5px;width:25px;height:25px;text-align:center;position:absolute;right:-15px;top:-15px;background:#ffc003;box-shadow:1px 2px 3px #b98b06a1;border-radius:50%;cursor:pointer;color:#fff;border:1px solid #fff;z-index:1}.pinned-note-header-line{position:absolute;left:3px;width:13px;box-shadow:1px 1px 2px #0006;border:1px solid #fff;margin-bottom:.5rem;margin-top:.5rem;height:calc(100% - 1rem);max-height:20px}.pinned-note-header-right{cursor:pointer;float:right;margin-left:3px;width:32px}.pinned-note-header-time{font-size:.6rem}.pinned-note-header-button-unpin{opacity:.8;display:none;width:14px;height:14px;float:left;margin-right:2px}.pinned-note-header-button-complete{padding-top:2px;display:none}.pinned-note-body{float:right;width:100%;padding:.5rem .5rem .5rem 25px}.pinned-note-body:hover{background-color:#feeb82}.pinned-note-body:hover .pinned-note-header-time{display:none}.pinned-note-body:hover .pinned-note-header-button-unpin,.pinned-note-body:hover .pinned-note-header-button-complete{display:block}.pinned-note-line-title{display:block;font-weight:700;padding-bottom:6px;color:#333}.pinned-note-line{display:block}.view-port{position:absolute;display:none;height:0;width:0;background:transparent;z-index:999;box-shadow:0 0 0 9999px #00000096;border-radius:5px}.view-port-mask{position:absolute;display:block;height:100%;width:100%;top:0;left:0;background:transparent;z-index:9998}.tinymce-control{width:100%;border:1px solid #ccc;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;display:none}.input-tab-trap{opacity:0!important;filter:alpha(opacity=0)!important;width:0!important;overflow:hidden!important}.color-value input{font-size:.8em;line-height:16px}.dialog-material.mobile{width:100%!important}video,video:focus,audio,audio:focus{outline:none}.iv-image-view img.iv-image{animation:fadein .5s;visibility:hidden!important}@keyframes fadein{0%{opacity:0}to{opacity:1}}.iv-image-view img.iv-image.show{visibility:visible!important}.row-line{padding-top:0;padding-bottom:0}.fc-ltr{padding-bottom:7px}.padding-bottom-5px{padding-bottom:5px}.no-margin{margin:0!important}.no-padding{padding:0}.no-padding-left{padding-left:0}.float-left{float:left}body .fc .fc-toolbar .fc-button{color:#fff;background-color:#007ad9;border:1px solid #007ad9;font-size:14px;transition:background-color .2s,box-shadow .2s;border-radius:3px}body .fc .fc-toolbar .fc-button:enabled:hover{background-color:#116fbf;color:#fff;border-color:#116fbf}body .fc .fc-toolbar .fc-button:focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2em #8dcdff}body .fc .fc-toolbar .fc-button-group .fc-button{border-radius:0}body .fc .fc-toolbar .fc-button-group .fc-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}body .fc .fc-toolbar .fc-button-group .fc-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}body .fc .fc-toolbar .fc-right .fc-button{border-radius:0}body .fc .fc-toolbar .fc-right .fc-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}body .fc .fc-toolbar .fc-right .fc-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fc-toolbar>*>:not(:first-child){margin-left:0}.old-content,.fc-axis,.fc-timeGridDay-button,.fc-timeGridWeek-button,.fc-dayGridMonth-button{text-indent:-9999px;line-height:0}.new-content,.fc-axis:after,.fc-timeGridDay-button:after,.fc-timeGridWeek-button:after,.fc-dayGridMonth-button:after{text-indent:0;display:block;line-height:initial}.fc-dayGridMonth-button:after{content:\"Th\\e1ng\";padding:.2em}.fc-timeGridWeek-button:after{content:\"Tu\\1ea7n\";padding:.2em}.fc-timeGridDay-button:after{content:\"Ng\\e0y\";padding:.2em}body .fc th{background-color:#f4f4f4;border:1px solid #c8c8c8;color:#333;padding:.571em 1em}.ui-fluid .button-group p-button,.ui-fluid .button-group button{margin-right:.5em!important;width:auto;text-align:left}.layout-wrapper .layout-menu-container{z-index:97}.base-status,.base-status-immediately,.base-status-urgent,.base-status-high,.base-status-medium,.base-status-low,.base-status-ended,.base-status-aborted,.base-status-completed,.base-status-rejected,.base-status-returned,.base-status-approved,.base-status-pending,.base-status-on-conducting,.base-status-on-going,.base-status-create-new{padding:3px;border-radius:.25em;color:#fff;font-size:.8em;text-align:center}.base-status-create-new{color:#666;background-color:#f2f2f2}.base-status-on-going,.base-status-on-conducting{background-color:#337ab7}.base-status-pending{background-color:#ffba01}.base-status-approved{background-color:#34a835}.base-status-returned{background-color:#ffba01}.base-status-rejected{background-color:#d9534f}.base-status-completed{background-color:#34a835}.base-status-aborted{background-color:#ffba01}.base-status-ended{background-color:#34a835}.base-status-low,.base-status-medium{color:#666;background-color:#f2f2f2}.base-status-high{background-color:#ffba01}.base-status-urgent,.base-status-immediately{background-color:#d9534f}.text-align-center{text-align:center}.font-weight-bold{font-weight:700}.landing-body .landing-menu li a:hover{border-bottom:none}.landing-body .landing-menu li:first-child{margin-left:8px}.crud-form .label-control p{margin:0;padding:0}.crud-form .tn-check-box-list .p-row{display:block;padding:.5em;width:100%}.crud-form tn-mask,.crud-form dropdown{width:100%}.crud-form .tn-dropdown{min-height:32px}.crud-form .tn-dropdown.free-text.horizontal{display:flex}.crud-form .tn-dropdown.free-text.horizontal>div{flex-grow:1;padding-left:.5em;padding-right:.5em}.crud-form .tn-dropdown.free-text.horizontal>div:first-child{padding-left:0}.crud-form .tn-dropdown.free-text.horizontal>div:last-child{padding-right:0}.crud-form .tn-dropdown.free-text.vertical input.ui-inputtext.input-free-text{margin-top:.5em}.crud-form.assessment .label-control{font-weight:700}.crud-form.assessment .label-control.haveIndex{position:relative;padding-left:20px;margin-bottom:5px;display:block}.crud-form.assessment .label-control.haveIndex:before{content:\" \" attr(label-index) \".\";position:absolute;left:0;top:0}.crud-form.assessment .ViewMode{border-bottom:none}.crud-form.assessment .ViewMode .label-control{margin-bottom:0}body .ui-inputtext.min-width{padding:6px}.ps__rail-x,.ps__rail-y{z-index:2}.zIndex5 .ps__rail-x,.zIndex5 .ps__rail-y{z-index:5}.table-sticky table{border-collapse:separate;border-spacing:0}.table-sticky tr th,.table-sticky tr td{border:none!important;border-right:1px solid #eee!important;border-bottom:1px solid #eee!important}.table-sticky tr th:first-child,.table-sticky tr td:first-child{border-left:1px solid #eee!important}.table-sticky tr th:last-child,.table-sticky tr td:last-child{border-right:none!important}.table-sticky tr:first-child th{border-top:1px solid #eee!important}.table-sticky th{background:#eee}.table-sticky tbody td.disabled{background:#eee!important}.table-sticky tbody td.disabled:not(:last-child){border-right:1px solid white!important}.table-sticky.fix-height tr:first-child th{position:sticky;top:0;z-index:2}.container-flex{display:flex;align-items:center}.container-flex>div:first-child{flex:0 0 auto;margin-right:.5em}.container-flex>div:last-child{flex-grow:1}.container-control{display:flex}.container-control>span.label{flex:0 0 auto;padding-top:.5em;padding-right:.5em}.container-control>span.label+*{flex-grow:1;flex-shrink:1;position:relative}.container-control>span.label+* .tn-dropdown,.container-control>span.label+* .ui-autocomplete-multiple,.container-control>span.label+* .ui-inputgroup .ui-inputtext{width:100%}.container-control>span.label+* .validation-container{margin-top:3px}.container-control>span.label+* .validation-container .validate-item{white-space:unset}.container-control>span.label+*>div{position:absolute;left:0;top:0;width:100%}.container-control.no-label>span.label{display:none}.container-control.inline{display:inline-flex}.align-flex-center{display:flex;justify-content:center;align-items:center}@media print{.isPrinting>*{display:none}.isPrinting app-print-layout{display:block}}.layout-wrapper .topbar .topbar-left,.layout-wrapper .topbar .topbar-right{background:#397ac3}#searchResultPanel-holder{padding:0 .5em}.cus-dropdown{line-height:initial;margin-right:1em}.tn-thumbnail{padding:.5rem}.tn-thumbnail.tn-thumbnail.tn-thumbnail{box-sizing:border-box}.fa-10:before{content:\"A+\";font-weight:700;font-family:cursive}.layout-wrapper .topbar .topbar-right #menu-button i{font-size:20px;margin-top:4px}.layout-wrapper .layout-menu li a i.menuitem-toggle-icon{font-size:15px;margin-left:auto}.flex-container-main-content{display:flex;flex-direction:column}.flex-container-main-content>div:last-child{background-color:#f4f4f4;flex:1 1;display:flex;overflow:hidden;position:relative}.flex-container-main-content>div:last-child>div{padding-top:.5em;overflow:hidden;position:absolute;left:0;top:0;width:100%;height:100%}.flex-container-main-content .block-with-button-search{display:flex;justify-content:flex-end}.flex-container-main-content .block-with-button-search>*{margin-left:.5em}.flex-container-main-content .block-with-button-search>input{margin-left:0;max-width:200px;width:100%;height:26px}.flex-container-main-content .block-with-button-search>dropdown{max-width:140px;width:100%}.flex-container-main-content .title-main-component{border-bottom:2px solid #1ca7ff}.clickable-table.clickable-table{cursor:pointer}.main-crud-container{height:calc(100vh - 76px)}.flex-container-fit-child{display:flex;flex-direction:column;height:100%;overflow:hidden}.flex-container-fit-child>div.fit-content{flex:1 1;position:relative}.flex-container-fit-child>div.fit-content>div{position:absolute;height:100%;width:100%;overflow:auto}.waiting-box{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;display:none}.waiting-box .overlay{background-color:red;background-color:#6d6d6d80;width:100%;height:100%}.waiting-box .content-loading{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.waiting-box.show{display:block}.function-topbar>*{vertical-align:top}.function-topbar button{width:auto}.function-topbar p-fileUpload{margin-right:1em}.function-topbar .container-control{display:inline-flex;line-height:initial}.function-topbar .container-control dropdown{width:100%}*:focus{outline-color:#a6d5fa!important}address{font-style:normal}body .p-toast .p-toast-message{border-radius:0;border-width:0 0 0 4px!important}.status span,.__status span{font-size:.8rem}p-table.single-check .p-datatable .p-datatable-tbody>tr{cursor:pointer}p-table.single-check .p-datatable .p-datatable-tbody>tr.p-state-highlight{background:#e3f2fd!important;outline:2px solid #a6d5fa}p-table.single-check .p-datatable .p-datatable-tbody>tr td.sticky .fix-sticky.top{display:none}p-table.multi-check .p-datatable .p-datatable-tbody>tr.p-state-highlight{background:#e3f2fd!important}p-table.multi-check .p-datatable .p-datatable-tbody>tr.p-state-highlight td{border-color:#fff}p-table.multi-check .p-datatable .p-datatable-tbody>tr.p-state-highlight td .fix-sticky{background-color:#fff}.tn-animated-right-arrow-icon,.tn-animated-left-arrow-icon{height:32px;width:14px;position:relative;z-index:10}.tn-animated-right-arrow-icon{animation:arrowBounceToRight .8s ease-in-out infinite alternate}.tn-animated-left-arrow-icon{animation:arrowBounceToLeft .8s ease-in-out infinite alternate}.tn-animated-right-arrow-icon:before,.tn-animated-left-arrow-icon:before,.tn-animated-right-arrow-icon:after,.tn-animated-left-arrow-icon:after{content:\"\";position:absolute;background-color:#88b0dd;width:5px;height:20px;display:block}.tn-animated-right-arrow-icon:before{left:4px;top:0;transform:rotate(-35deg)}.tn-animated-right-arrow-icon:after{left:4px;top:14px;transform:rotate(35deg)}.tn-animated-left-arrow-icon:before{right:4px;top:0;transform:rotate(35deg)}.tn-animated-left-arrow-icon:after{right:4px;top:14px;transform:rotate(-35deg)}@keyframes arrowBounceToLeft{0%{transform:translate(-3px)}to{transform:translate(3px)}}@keyframes arrowBounceToRight{0%{transform:translate(3px)}to{transform:translate(-3px)}}.pass{color:#49c949;margin:5px;text-align:center}.not-pass{color:red;margin:5px;text-align:center}\n"] }]
589
+ args: [{ selector: 'chat-box', providers: [ComponentContextService, CheckControlVisibleService], template: "<div class=\"dashboard\">\r\n <div class=\"chat\">\r\n <div class=\"group-info\">\r\n <a href=\"javascript:\">C\u00F3 {{peopleAll.length}} ng\u01B0\u1EDDi trong nh\u00F3m n\u00E0y</a>\r\n <div class=\"circleButton\" pTooltip=\"Xem to\u00E0n b\u1ED9 \u0111\u00EDnh k\u00E8m\" tooltipPosition=\"top\">\r\n <a href=\"javascript:\"><i class=\"far fa-images\"></i></a>\r\n </div>\r\n <div (click)=\"addPeople()\" class=\"circleButton\" pTooltip=\"Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi v\u00E0o nh\u00F3m\" tooltipPosition=\"top\"\r\n disabled=\"true\">\r\n <a href=\"javascript:\"><i class=\"fas fa-user-plus\"></i></a>\r\n </div>\r\n </div>\r\n <ul #scrollMe [ngClass]=\"{'hasPin': model.pinnedMessage != null}\">\r\n <li *ngIf=\"model.pinnedMessage\" class=\"clearfix pin\" [ngClass]=\"{'message-from': true}\">\r\n <ng-container\r\n *ngTemplateOutlet=\"messageItem; context: { i : -1, item: model.pinnedMessage, isPinnedMessage: true}\">\r\n </ng-container>\r\n </li>\r\n <li *ngFor=\"let item of model.dataSource; let i = index; trackBy: trackByFunc\" class=\"clearfix\"\r\n [ngClass]=\"{ 'message-own': item.type == 'own'}\">\r\n <ng-container *ngTemplateOutlet=\"messageItem; context: { i : i, item: item}\">\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <!-- <chat-send-message-box *ngIf=\"showSendMessageBox\"></chat-send-message-box>-->\r\n <div [ngClass]=\"{'visible2': model.scrolling, 'hidden2': !model.scrolling}\" class=\"scroll-to-bottom\">\r\n <span *ngIf=\"model.newMessageNotUpdatedCount > 0\" (click)=\"scrollToBottom(350, true, null)\">\r\n {{model.newMessageNotUpdatedCount <= 5 ? model.newMessageNotUpdatedCount : '5+' }} </span>\r\n <span (click)=\"scrollToBottom(350, true, null)\" *ngIf=\"model.newMessageNotUpdatedCount == 0\">\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<file-viewer *ngIf=\"fileViewerModel.showEditForm\" [parentContext]=\"context\" [parentModel]=\"model\"\r\n [model]=\"fileViewerModel\">\r\n</file-viewer>\r\n\r\n<ng-template #messageItem let-i=\"i\" let-isPinnedMessage=\"isPinnedMessage\" let-item=\"item\">\r\n <img *ngIf=\"item.isFirstMessageFlow && item.type != 'own' && !isPinnedMessage && item.avatar != null\" alt=\"\"\r\n class=\"chat-avatar\" src=\"{{getCurrentUserAvatar(item.avatar)}}\">\r\n <p *ngIf=\"(item.isFirstMessageFlow && item.type != 'own') && !isPinnedMessage\" class=\"message-created-by\">\r\n {{item.fullName}}\r\n </p>\r\n <span *ngIf=\"!hasAttachment(item)\">\r\n <!-- [class]=\"addClassToMessage(item, isPinnedMessage)\">-->\r\n <p *ngIf=\"!hasAttachment(item)\" class=\"message-content\">\r\n <i (click)=\"pinMessage(item)\" class=\"fas fa-thumbtack\" style=\"right: 0;\"></i>\r\n <i (click)=\"quickNote(item)\" class=\"fas fa-sticky-note\"></i>\r\n {{item.content}}\r\n </p>\r\n <p *ngIf=\"!isPinnedMessage && (item.isLastMessageFlow || !inTheSameTime(i, item, model.dataSource))\"\r\n class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n <p *ngIf=\"isPinnedMessage\" class=\"message-created\">\r\n {{item.createdBy}} \u0111\u00E3 g\u1EEDi l\u00FAc {{item.created | date:'dd/MM/yyyy HH:mm'}}\r\n </p>\r\n </span>\r\n <ng-container *ngIf=\"hasAttachment(item)\">\r\n <ng-container *ngFor=\"let attachmentItem of item.attachments;let index=index\">\r\n <div class=\"file\"\r\n [ngClass]=\"{'first':item.isFirstMessageFlow && index == 0, 'middle':index > 0 || !item.isFirstMessageFlow, 'image' : attachmentItem.type == 'image'}\"\r\n [ngStyle]=\"{'width': model.img[i + 'width' + index]}\">\r\n <p class=\"attachment\">\r\n <span (mouseup)=\"onMouseUp($event)\" class=\"attachment-item\">\r\n <a *ngIf=\"attachmentItem.type != 'image'\" (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <i class=\"fas fa-paperclip\"></i>{{attachmentItem.fileName}}\r\n </a>\r\n <a *ngIf=\"attachmentItem.type == 'image'\" #aElement\r\n [ngClass]=\"{'hidden': !model.img[i + '' + index], 'visible':model.img[i + '' + index]}\"\r\n (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <img class=\"message-img\" (load)=\"loadImg($event, i, index)\"\r\n [src]=\"attachmentItem.url | secure | async\" />\r\n </a>\r\n </span>\r\n </p>\r\n <div style=\"clear: both\"></div>\r\n <p class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n </div>\r\n <div style=\"clear: both\"></div>\r\n </ng-container>\r\n </ng-container>\r\n <after-view-checked *ngIf=\"model.dataSource.length == i + 1\" (loading)=\"scrollToBottom(0, false, item.sent)\">\r\n </after-view-checked>\r\n</ng-template>\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\"-->\r\n<!-- (onCancel)=\"userPickerForm.show = false\"-->\r\n<!-- (onHide)=\"userPickerForm.show = false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n<!-- <user-picker-box #formBase [control]=\"userPickerControl\"-->\r\n<!-- [(ngModel)]=\"this.peopleAll\" [multiple]=\"userPickerControl.multiple\">-->\r\n<!-- </user-picker-box>-->\r\n<!--</tn-dialog>-->\r\n\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\" (onHide)=\"userPickerForm.show == false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n\r\n<!-- &lt;!&ndash;<quick-add-form *ngIf=\"model.editFormModel.showQuickNoteForm\" [parentContext]=\"context\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; [parentModel]=\"context.data.noteDataModel\"></quick-add-form>&ndash;&gt;-->\r\n<!--</tn-dialog>-->", styles: [".paging-advance{list-style:none;padding-left:0;margin:3px 0}.paging-advance li{width:150px;padding-left:15px;line-height:30}.paging-advance li.disabled{color:#bdbdbd;outline:none}.paging-advance li.disabled:hover{cursor:default;background:none}.paging-advance li:hover{cursor:pointer;background:red}.paging-advance-overlay .ui-overlaypanel-content{padding:0}.paging-advance-overlay.ui-overlaypanel-shifted:before{right:auto;left:1.25em;margin-left:-10}.paging-advance-overlay.ui-overlaypanel-shifted:after{right:auto;left:1.25em;margin-left:-8px}.chat-avatar{height:36px;border:2px solid #eee}\n"] }]
591
590
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.ChatService }, { type: i2.MessageBoardService }, { type: i3.UserService }, { type: i4.CheckControlVisibleService }, { type: i5.SignalRService }, { type: i6.FileExplorerService }, { type: i7.CrudService }, { type: i8.NotifierService }, { type: i9.EnvironmentService }]; }, propDecorators: { taskId: [{
592
591
  type: Input
593
592
  }], serviceCode: [{
@@ -605,4 +604,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
605
604
  type: ViewChild,
606
605
  args: ['fileElement']
607
606
  }] } });
608
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9jaGF0L2NoYXQtYm94L2NoYXQtYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC9jaGF0LWJveC9jaGF0LWJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF3QixLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxxQ0FBcUM7QUFDckMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBTTdGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBR2hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBTTdGLHFCQUFxQjtBQUNyQiwwQkFBMEI7QUFRMUIsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGFBQWE7SUEyQy9DLFlBQ0ksUUFBa0IsRUFDVixZQUF5QixFQUN6QixvQkFBeUMsRUFDekMsWUFBeUIsRUFDekIsb0JBQWdELEVBQ2hELGVBQStCLEVBQy9CLFlBQWlD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QUFDO2FBQ3ZCO2lCQUNJO2dCQUNELFVBQVUsR0FBRyxRQUFRLENBQUM7YUFDekI7U0FDSjtRQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDcEIsVUFBVSxHQUFHLFNBQVMsQ0FBQztTQUMxQjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7OzZHQTlvQlEsZ0JBQWdCO2lHQUFoQixnQkFBZ0IseUtBRmQsQ0FBQyx1QkFBdUIsRUFBRSwwQkFBMEIsQ0FBQyw4T0MvQnBFLDBsUEFpSG1COzJGRGhGTixnQkFBZ0I7a0JBTjVCLFNBQVM7K0JBQ0ksVUFBVSxhQUdULENBQUMsdUJBQXVCLEVBQUUsMEJBQTBCLENBQUM7c1hBR3ZELE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUVjLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTztnQkFDUSxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG4vLyBpbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2ZpbGV1cGxvYWQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgUG9wdXBTaXplLCBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgVG5Vc2VyIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RuLXVzZXInO1xyXG5pbXBvcnQgeyBDaGVja0NvbnRyb2xWaXNpYmxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoZWNrLWNvbnRyb2wtdmlzaWJsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jcnVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNpZ25hbFJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc2lnbmFsci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTyB9IGZyb20gJy4uLy4uL2ZpbGUtZXhwbG9yZXIvbW9kZWxzL2dlbmVyYXRlLWxpbmstZG93bmxvYWQtZHRvJztcclxuaW1wb3J0IHsgU2VydmljZVJlcXVlc3RNb2RlbCB9IGZyb20gJy4uLy4uL2ZpbGUtZXhwbG9yZXIvbW9kZWxzL3NlcnZpY2UtcmVxdWVzdC1tb2RlbCc7XHJcbmltcG9ydCB7IEZpbGVFeHBsb3JlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9maWxlLWV4cGxvcmVyL3NlcnZpY2VzL2ZpbGUtZXhwbG9yZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VUeXBlLCBORVdfTUVTU0FHRSwgTm90aWZpY2F0aW9uVHlwZSwgUElOTkVEX0NIQU5HRUQgfSBmcm9tICcuLi9tb2RlbHMvZW51bXMnO1xyXG5pbXBvcnQgeyBFZGl0Rm9ybU1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL21vZGVscyc7XHJcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2hhdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVzc2FnZUJvYXJkU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21lc3NhZ2UtYm9hcmQuc2VydmljZSc7XHJcblxyXG5cclxuLy8gZml4IGZvciBidWlsZCBwcm9kXHJcbi8vIGNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY2hhdC1ib3gnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtYm94LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NoYXQtYm94LmNvbXBvbmVudC5zY3NzJywgJy4uL2NvbW1vbi1zdHlsZS5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtDb21wb25lbnRDb250ZXh0U2VydmljZSwgQ2hlY2tDb250cm9sVmlzaWJsZVNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0Qm94Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBJbnB1dCgpIHRhc2tJZDogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgc2VydmljZUNvZGU6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIGVudGl0eTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgdXNlcnM6IGFueTtcclxuICAgIEBJbnB1dCgpIHNob3dTZW5kTWVzc2FnZUJveDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2ZpbGVFbGVtZW50JykgZmlsZUVsZW1lbnQ6IEZpbGVVcGxvYWQ7XHJcblxyXG4gICAgcmVhZG9ubHkgZGVmYXVsdEF2YXRhcjtcclxuXHJcbiAgICB1c2VyUGlja2VyRm9ybTogRWRpdEZvcm1Nb2RlbCA9IHtcclxuICAgICAgICBzZWxlY3RlZFZhbHVlOiBbXSxcclxuICAgICAgICBkYXRhOiBudWxsLFxyXG4gICAgfTtcclxuICAgIHVzZXJQaWNrZXJDb250cm9sOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYTtcclxuICAgIGZpbGVWaWV3ZXJNb2RlbDoge1xyXG4gICAgICAgIGRhdGE6IGFueSxcclxuICAgICAgICBzaG93RWRpdEZvcm06IGJvb2xlYW4sXHJcbiAgICB9O1xyXG5cclxuICAgIHRvcGljID0gJyc7XHJcbiAgICBmaXJzdFRpbWUgPSB0cnVlO1xyXG4gICAgbXVsdGlwbGUgPSB0cnVlO1xyXG4gICAgc2hvd0FkZE5vdGVGb3JtID0gZmFsc2U7XHJcbiAgICBmaWxlQXBpID0gJyc7XHJcbiAgICBwZW9wbGVBbGw6IGFueSA9IFtdO1xyXG4gICAgY29ycmVsYXRpb25JZHMgPSBbXTtcclxuICAgIGF0dGFjaG1lbnRzID0gW107XHJcbiAgICBpbWFnZSA9ICcnO1xyXG4gICAgcGVvcGxlQWxsVXNlcnMgPSBbXTtcclxuICAgIHBlb3BsZVJlbGF0ZWRVc2VycyA9IFtdO1xyXG4gICAgZWRpdEZvcm1Nb2RlbCA9IHt9O1xyXG5cclxuICAgIHNlcnZpY2VSZXF1ZXN0TW9kZWw6IFNlcnZpY2VSZXF1ZXN0TW9kZWw7XHJcbiAgICBjdXJyZW50VXNlcjogVG5Vc2VyO1xyXG4gICAgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICAgIC8vIGZpbGVWaWV3ZXI6IGFueTtcclxuICAgIGFzc2lnbmVlOiBhbnk7XHJcbiAgICBhc3NpZ25lcjogYW55O1xyXG4gICAgcmVsYXRlZFVzZXI6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBfY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX21lc3NhZ2VCb2FyZFNlcnZpY2U6IE1lc3NhZ2VCb2FyZFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2NoZWNrQ29udHJvbFZpc2libGU6IENoZWNrQ29udHJvbFZpc2libGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3NpZ25hbHJTZXJ2aWNlOiBTaWduYWxSU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9maWxlU2VydmljZTogRmlsZUV4cGxvcmVyU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9lbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEF2YXRhciA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXREZWZhdWx0TWFsZUF2YXRhcigpO1xyXG4gICAgICAgIHRoaXMuZmlsZUFwaSA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRIdHRwU2VydmljZUVuZHBvaW50KCdmaWxlJyk7XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWwudXNlclBpY2tlckZvcm0gPSB7IHBvcHVwU2l6ZTogUG9wdXBTaXplLCBkYXRhOiB7fSB9O1xyXG4gICAgICAgIHRoaXMubW9kZWwucXVpY2tOb3RlRm9ybSA9IHsgcG9wdXBTaXplOiA8YW55Pnt9LCBkYXRhOiB7fSB9O1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRleHQuc3Vic2NyaWJlKCdRVUlDS19OT1RFX1BPUFVQLkNMT1NFX1BPUFVQJywgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmVkaXRGb3JtTW9kZWwuc2hvd1F1aWNrTm90ZUZvcm0gPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVVc2Vycyhhc3NpZ25lZTogYW55LCBhc3NpZ25lcjogYW55LCByZWxhdGVkVXNlcjogYW55W10pIHtcclxuICAgICAgICB0aGlzLmFzc2lnbmVlID0gYXNzaWduZWU7XHJcbiAgICAgICAgdGhpcy5hc3NpZ25lciA9IGFzc2lnbmVyO1xyXG4gICAgICAgIHRoaXMucmVsYXRlZFVzZXIgPSByZWxhdGVkVXNlcjtcclxuICAgICAgICBsZXQgYWxsID0gW107XHJcbiAgICAgICAgYWxsLnB1c2goYXNzaWduZWUpO1xyXG4gICAgICAgIGFsbC5wdXNoKGFzc2lnbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5yZWxhdGVkVXNlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGFsbCA9IGFsbC5jb25jYXQocmVsYXRlZFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBlb3BsZUFsbCA9IGFsbC5maWx0ZXIoKHgsIGksIGEpID0+IGEuaW5kZXhPZih4KSA9PSBpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmluaXRDbGFzc1ZhcigpO1xyXG5cclxuICAgICAgICB0aGlzLmdldE1lc3NhZ2VzKG51bGwpO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGF0U2VydmljZS5nZXRDaGF0SWRCeVRhc2sodGhpcy5zZXJ2aWNlUmVxdWVzdE1vZGVsLCB0aGlzLnRhc2tJZCkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcnMuc3VjY2VzcykgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKHJzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZiAoIXJzLmRhdGEpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5pZCA9IHJzLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSU5TVEFOQ0VfSURfTE9BREVELCB0aGlzLm1vZGVsLmlkKTtcclxuICAgICAgICAgICAgdGhpcy50b3BpYyA9IGBjaGF0LiR7dGhpcy5tb2RlbC5pZH1gO1xyXG4gICAgICAgICAgICB0aGlzLl9zaWduYWxyU2VydmljZS5zdGFydChudWxsLCB0aGlzLnRvcGljLCBkYXRhID0+IHRoaXMuaGFuZGxlQ2hhbmdlcyhkYXRhKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgcGlubmVkIG1lc3NhZ2VcclxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VCb2FyZFNlcnZpY2UuZ2V0TGF0ZXN0UGlubmVkTWVzc2FnZSh0aGlzLm1vZGVsLmlkKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocnMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBpbm5lZE1lc3NhZ2UgPSBycy5kYXRhLmNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9NRVNTQUdFX1NFTkRJTkcsIGFzeW5jIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLnB1c2goZGF0YS5tZXNzYWdlLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5hdHRhY2htZW50cyAmJiBkYXRhLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGRhdGEuYXR0YWNobWVudHMgPSBkYXRhLmF0dGFjaG1lbnRzLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB4LnVybCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdGVtcCA9IGF3YWl0IHRoaXMuYXBwZW5kTWVzc2FnZShkYXRhLm1lc3NhZ2UubWVzc2FnZUNvbnRlbnQsICdvd24nLCAnc2VuZGluZycsIHRoaXMuY3VycmVudFVzZXIudXNlck5hbWUsIGRhdGEuYXR0YWNobWVudHMsIGRhdGEubWVzc2FnZS5jb3JyZWxhdGlvbklkLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRlbXApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5DSEFUX01FU1NBR0VfU0VOVCwgZGF0YSA9PiB7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTE9BRF9NT1JFLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgLy8gdGhpcy5nZXRNZXNzYWdlcyh0aGlzLm1vZGVsLmNyZWF0ZWRGcm9tKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9TQ1JPTExJTkcsIHNjcm9sbGluZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzY3JvbGxpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2Nyb2xsaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2Nyb2xsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLm5ld01lc3NhZ2VOb3RVcGRhdGVkQ291bnQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSEFTX05FV19NRVNTQUdFX05PVF9VUERBVEVELCBjb3VudCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2Nyb2xsaW5nID0gY291bnQgIT09IDA7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwubmV3TWVzc2FnZU5vdFVwZGF0ZWRDb3VudCA9IGNvdW50O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRleHQuc3Vic2NyaWJlKCdDTE9TRV9QT1BVUCcsIHJzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC51c2VyUGlja2VyRm9ybS5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Q29udGV4dC5maXJlRXZlbnQoJ1RBU0suUkVMQVRFRF9VU0VSX0NIQU5HRUQnLCBycyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50Q29udGV4dC5zdWJzY3JpYmUoJ1RBU0suREFUQV9DSEFOR0VEJywgcnMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJzKHJzLmFzc2lnbmVlLCBycy5hc3NpZ25lciwgcnMucmVsYXRlZFVzZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2hhbmdlcyhkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZSA9IEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgaWYgKCFuZXdNZXNzYWdlIHx8ICFuZXdNZXNzYWdlLmRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTWVNfRVJSX0RFVjogTOG7l2kgU2lnbmFsUicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKG5ld01lc3NhZ2Uubm90aWZpY2F0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuTmV3TWVzc2FnZTpcclxuICAgICAgICAgICAgY2FzZSBORVdfTUVTU0FHRToge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKG5ld01lc3NhZ2UuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuUGlubmVkQ2hhbmdlZDpcclxuICAgICAgICAgICAgY2FzZSBQSU5ORURfQ0hBTkdFRDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kID0gdGhpcy5tb2RlbC5jb3JyZWxhdGlvbklkcy5maW5kSW5kZXgoeCA9PiB4ID09IG5ld01lc3NhZ2UuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLnNwbGljZShpbmQsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVQaW5uZWRDaGFuZ2VOb3RpZmljYXRpb24obmV3TWVzc2FnZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdENsYXNzVmFyKCkge1xyXG4gICAgICAgIHRoaXMuZmlsZVZpZXdlck1vZGVsID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7fSxcclxuICAgICAgICAgICAgc2hvd0VkaXRGb3JtOiBmYWxzZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMudXNlclBpY2tlckNvbnRyb2wgPSBuZXcgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICBmaWVsZDogJ2lkJyxcclxuICAgICAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgICAgICBmdWxsTGFiZWw6ICcnLFxyXG4gICAgICAgICAgICBtdWx0aXBsZTogdHJ1ZSxcclxuICAgICAgICAgICAgaGlkZGVuQ2hlY2s6ICgpID0+IHRoaXMudXNlclBpY2tlckZvcm0uc2hvdyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNlcnZpY2VSZXF1ZXN0TW9kZWwgPSA8U2VydmljZVJlcXVlc3RNb2RlbD57XHJcbiAgICAgICAgICAgIHNlcnZpY2U6IHRoaXMuc2VydmljZUNvZGUsXHJcbiAgICAgICAgICAgIHNlcnZpY2VDb2RlOiB0aGlzLnNlcnZpY2VDb2RlLFxyXG4gICAgICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5LFxyXG4gICAgICAgICAgICBlbnRpdHlLZXk6ICdpZCcsXHJcbiAgICAgICAgICAgIGVudGl0eUluc3RhbmNlSWQ6IHRoaXMudGFza0lkXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UgPSBbXTtcclxuICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzID0gW107XHJcbiAgICAgICAgdGhpcy5tb2RlbC5hdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMubW9kZWwubWF4RmlsZVNpemUgPSAzMDAwMDAwO1xyXG4gICAgICAgIHRoaXMubW9kZWwuaW1nID0ge307XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5wZW9wbGVBbGxVc2VycyA9IFtdO1xyXG4gICAgICAgIHRoaXMucGVvcGxlUmVsYXRlZFVzZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5tb2RlbC5lZGl0Rm9ybU1vZGVsID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMudXNlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC50YXNrTmFtZSA9IHRoaXMudXNlcnMudGFza05hbWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy51c2Vycy5hc3NpZ25lZSxcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlcnMuYXNzaWduZXIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJzLnJlbGF0ZWRVc2Vyc1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nZXRSZWxhdGVkVXNlckluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0UmVsYXRlZFVzZXJJbmZvKCkge1xyXG4gICAgICAgIGNvbnN0IHBlb3BsZVJlbGF0ZWRVc2VycyA9IGF3YWl0IHRoaXMuX3VzZXJTZXJ2aWNlLmdldEJhc2ljVXNlcnNJbmZvKHRoaXMucmVsYXRlZFVzZXIuam9pbigpKTtcclxuICAgICAgICBpZiAocGVvcGxlUmVsYXRlZFVzZXJzID09IG51bGwgfHwgcGVvcGxlUmVsYXRlZFVzZXJzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBlb3BsZVJlbGF0ZWRVc2Vycykge1xyXG4gICAgICAgICAgICB0aGlzLnBlb3BsZVJlbGF0ZWRVc2Vycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLmZ1bGxOYW1lLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0uZnVsbE5hbWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5pZFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlUGlubmVkQ2hhbmdlTm90aWZpY2F0aW9uKGRhdGEpIHtcclxuICAgICAgICBpZiAoZGF0YS5waW5uZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlTmV3TWVzc2FnZU5vdGlmaWNhdGlvbihuZXdNZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc3QgaW5kID0gdGhpcy5tb2RlbC5jb3JyZWxhdGlvbklkcy5maW5kSW5kZXgoeCA9PiB4ID09IG5ld01lc3NhZ2UuY29ycmVsYXRpb25JZCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdNZXNzYWdlLm1lc3NhZ2VUeXBlID09IE1lc3NhZ2VUeXBlLkZJTEUpIHtcclxuICAgICAgICAgICAgbmV3TWVzc2FnZS5hdHRhY2htZW50cyA9IGF3YWl0IHRoaXMuX2NoYXRTZXJ2aWNlLmdldExpc3RBdHRhY2htZW50KG5ld01lc3NhZ2UuaWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBlbmRNZXNzYWdlKG5ld01lc3NhZ2UuY29udGVudCwgdGhpcy5nZXRUeXBlT2ZNZXNzYWdlKG5ld01lc3NhZ2UuY3JlYXRlZEJ5KSwgJ3JlY2VpdmVkJywgbmV3TWVzc2FnZS5jcmVhdGVkQnksIG5ld01lc3NhZ2UuYXR0YWNobWVudHMsICcnLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTWVzc2FnZShuZXdNZXNzYWdlLmNvcnJlbGF0aW9uSWQsIG5ld01lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLnNwbGljZShpbmQsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRNZXNzYWdlcyhjcmVhdGVkRnJvbSkge1xyXG4gICAgICAgIHRoaXMuX2NoYXRTZXJ2aWNlLmdldENvbnRlbnRCeVRhc2tJZCh0aGlzLnNlcnZpY2VSZXF1ZXN0TW9kZWwsIHRoaXMudGFza0lkKS50aGVuKGFzeW5jIHJzID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFVzZXJOYW1lID0gdGhpcy5jdXJyZW50VXNlci51c2VyTmFtZTtcclxuICAgICAgICAgICAgbGV0IG5lYXJCeUNyZWF0ZWQgPSAnJztcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgbGV0IHVzZXJOYW1lczogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgICAgIGlmICghcnMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhycy5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcnMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY3JlYXRlZEJ5ICYmIGl0ZW0uY3JlYXRlZEJ5ICE9ICcnKSB1c2VyTmFtZXMgKz0gYCR7aW5kZXggPT0gMCA/ICcnIDogJywnfSR7aXRlbS5jcmVhdGVkQnl9YDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHRoaXMubW9kZWwuY3JlYXRlZEZyb20gPSBpdGVtLmNyZWF0ZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaXRlbS50eXBlID0gaXRlbS5jcmVhdGVkQnkgPT09IGN1cnJlbnRVc2VyTmFtZSA/ICdvd24nIDogJ2Zyb20nO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLm1lc3NhZ2VUeXBlID09PSBNZXNzYWdlVHlwZS5GSUxFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hdHRhY2htZW50cyA9IGF3YWl0IHRoaXMuX2NoYXRTZXJ2aWNlLmdldExpc3RBdHRhY2htZW50KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGl0ZW0uaXNMYXN0TWVzc2FnZUZsb3cgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jcmVhdGVkQnkgIT09IG5lYXJCeUNyZWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK2l0ZW0gPiAtMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBycy5kYXRhWytpdGVtIC0gMV0uaXNMYXN0TWVzc2FnZUZsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBuZWFyQnlDcmVhdGVkID0gaXRlbS5jcmVhdGVkQnk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5pc0ZpcnN0TWVzc2FnZUZsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5pc0ZpcnN0TWVzc2FnZUZsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoK2luZGV4ID09PSBycy5kYXRhLmxlbmd0aCAtIDEpIGl0ZW0uaXNMYXN0TWVzc2FnZUZsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNyZWF0ZWRGcm9tKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UgPSBbLi4ucnMuZGF0YSwgLi4udGhpcy5tb2RlbC5kYXRhU291cmNlXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZSA9IHJzLmRhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJOYW1lcyAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlckluZm9zID0gYXdhaXQgdGhpcy5fdXNlclNlcnZpY2UuZ2V0QmFzaWNVc2Vyc0luZm9CeVVzZXJOYW1lcyh1c2VyTmFtZXMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJJbmZvcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMubW9kZWwuZGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gdXNlckluZm9zLmZpbmQoeCA9PiB4LnVzZXJOYW1lID09IGl0ZW0uY3JlYXRlZEJ5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmF2YXRhciA9IHVzZXIuYXZhdGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmZ1bGxOYW1lID0gdXNlci5mdWxsTmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9EQVRBX0xPQURFRCwgdHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9Cb3R0b20oc3BlZWQgPSAwLCBmb3JjZSA9IGZhbHNlLCBzZW50KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLnNjcm9sbGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5DSEFUX0hBU19ORVdfTUVTU0FHRSwgeyBzcGVlZCwgZm9yY2U6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNlbnQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSEFTX05FV19NRVNTQUdFLCB7IHNwZWVkLCBmb3JjZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYXBwZW5kTWVzc2FnZShtZXNzYWdlLCB0eXBlLCBzdGF0dXMsIGNyZWF0ZWRCeSwgYXR0YWNobWVudHMgPSBbXSwgY29ycmVsYXRpb25JZCA9ICcnLCBzZW50KSB7XHJcbiAgICAgICAgbGV0IGZ1bGxOYW1lID0gJyc7XHJcbiAgICAgICAgbGV0IGF2YXRhciA9ICcnO1xyXG5cclxuICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5fdXNlclNlcnZpY2UuZ2V0QmFzaWNVc2VySW5mb0J5VXNlck5hbWUoY3JlYXRlZEJ5KTtcclxuICAgICAgICBmdWxsTmFtZSA9IHVzZXIuZnVsbE5hbWUgPz8gJyc7XHJcbiAgICAgICAgYXZhdGFyID0gdXNlci5hdmF0YXIgPz8gJyc7XHJcblxyXG4gICAgICAgIGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsb25lZEF0dGFjaG1lbnQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnRzKSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnk6IGNyZWF0ZWRCeSxcclxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiBmdWxsTmFtZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgICAgIGF2YXRhcjogYXZhdGFyLFxyXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudHM6IGNsb25lZEF0dGFjaG1lbnQsXHJcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgaXNGaXJzdE1lc3NhZ2VGbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2VGbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHNlbnQ6IHNlbnRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlyc3RPckxhc3RNZXNzYWdlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlLnRyaW0oKSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEJ5OiBjcmVhdGVkQnksXHJcbiAgICAgICAgICAgICAgICBmdWxsTmFtZTogZnVsbE5hbWUsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiBtZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgYXZhdGFyOiBhdmF0YXIsXHJcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgaXNGaXJzdE1lc3NhZ2VGbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2VGbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHNlbnQ6IHNlbnRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlyc3RPckxhc3RNZXNzYWdlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5kYXRhU291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUZpcnN0T3JMYXN0TWVzc2FnZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlWzBdLmlzRmlyc3RNZXNzYWdlRmxvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2VbbGVuZ3RoIC0gMl0uY3JlYXRlZEJ5O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEJ5MiA9IHRoaXMubW9kZWwuZGF0YVNvdXJjZVtsZW5ndGggLSAxXS5jcmVhdGVkQnk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZEJ5ICE9PSBjcmVhdGVkQnkyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlW2xlbmd0aCAtIDJdLmlzTGFzdE1lc3NhZ2VGbG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2VbbGVuZ3RoIC0gMV0uaXNGaXJzdE1lc3NhZ2VGbG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZVtsZW5ndGggLSAyXS5pc0xhc3RNZXNzYWdlRmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZVtsZW5ndGggLSAxXS5pc0xhc3RNZXNzYWdlRmxvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTWVzc2FnZShjb3JyZWxhdGlvbklkLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMubW9kZWwuZGF0YVNvdXJjZS5maW5kKHggPT4geC5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkKTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXR0YWNobWVudHMgJiYgbWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS5pZCA9IG1lc3NhZ2UuaWQ7XHJcbiAgICAgICAgICAgIGl0ZW0uc2VudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZU1lc3NhZ2VTdGF0dXMobWVzc2FnZSwgc3RhdHVzLCBlcnJvck1lc3NhZ2UgPSAnJykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2UuZmluZCh4ID0+IHgubWVzc2FnZSA9PT0gbWVzc2FnZSk7XHJcbiAgICAgICAgaXRlbS5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgICAgaXRlbS5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGlzcGxheVN0YXR1cyhzdGF0dXMpIHtcclxuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xyXG4gICAgICAgICAgICBjYXNlICdzZW5kaW5nJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnxJBhbmcgZ+G7rWknO1xyXG4gICAgICAgICAgICBjYXNlICdzZW50JzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnxJDDoyBn4butaSc7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIC8vIHVuc2NyaWJsZSBzaWduYWxyXHJcbiAgICAgICAgdGhpcy5fc2lnbmFsclNlcnZpY2UudW5TdWJzY3JpYmVWaWV3Q29kZShudWxsLCB0aGlzLnRvcGljKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTUVTU0FHRV9TRU5ESU5HKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTUVTU0FHRV9TRU5UKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTE9BRF9NT1JFKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfU0NST0xMSU5HKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSEFTX05FV19NRVNTQUdFX05PVF9VUERBVEVEKTtcclxuXHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUeXBlT2ZNZXNzYWdlKGNyZWF0ZWRCeSkge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVkQnkgPT09IHRoaXMuY3VycmVudFVzZXIudXNlck5hbWUgPyAnb3duJyA6ICdmcm9tJztcclxuICAgIH1cclxuXHJcbiAgICB0cmFja0J5RnVuYyhpbmRleCwgaXRlbSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHRyYWNrQXR0YWNobWVudEJ5RnVuYyhpbmRleCwgaXRlbSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmZpbGVOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdERhdGEgPSB0aGlzLmdldEltYWdlQ2xpcGJvYXJkRGF0YShldmVudCk7XHJcbiAgICAgICAgaWYgKG9iamVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5hdHRhY2htZW50cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsXHJcbiAgICAgICAgICAgICAgICB1cmw6IG9iamVjdERhdGEudXJsLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogb2JqZWN0RGF0YS5ibG9iLFxyXG4gICAgICAgICAgICAgICAgZmlsZU5hbWU6IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpICsgJy5wbmcnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbWFnZUNsaXBib2FyZERhdGEoZSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZS5jbGlwYm9hcmREYXRhLml0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlLmNsaXBib2FyZERhdGEuaXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUuaW5kZXhPZignaW1hZ2UnKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VPYmogPSBpdGVtLmdldEFzRmlsZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGltYWdlT2JqLnNpemUgPCB0aGlzLm1vZGVsLm1heEZpbGVTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdXJsOiBVUkwuY3JlYXRlT2JqZWN0VVJMKGltYWdlT2JqKSwgYmxvYjogaW1hZ2VPYmogfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB2aWV3T3JEb3dubG9hZEZpbGUoZXZ0LCBhdHRhY2htZW50SXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9maWxlU2VydmljZS5pc1N1cHBvcnRlZFZpZXdPbmxpbmUoYXR0YWNobWVudEl0ZW0uZmlsZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubW9kZWwuZmlsZVZpZXdlci5kYXRhID0ge307XHJcbiAgICAgICAgICAgIC8vIHRoaXMubW9kZWwuZmlsZVZpZXdlci5kYXRhLmZpbGVJZCA9IGF0dGFjaG1lbnRJdGVtLmlkO1xyXG4gICAgICAgICAgICAvLyB0aGlzLm1vZGVsLmZpbGVWaWV3ZXIuZGF0YS5maWxlTmFtZSA9IGF0dGFjaG1lbnRJdGVtLmZpbGVOYW1lO1xyXG4gICAgICAgICAgICAvLyB0aGlzLm1vZGVsLmZpbGVWaWV3ZXIuZGF0YS5pc0ZpbGVWZXJzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubW9kZWwuZmlsZVZpZXdlci5zaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5maWxlVmlld2VyTW9kZWwgPSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBhdHRhY2htZW50SXRlbS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogYXR0YWNobWVudEl0ZW0uZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNGaWxlVmVyc2lvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2hvd0VkaXRGb3JtOiB0cnVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdG9wLmxvY2F0aW9uLmhyZWYgPSBhd2FpdCB0aGlzLmRvd25sb2FkKGF0dGFjaG1lbnRJdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkKGZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gbmV3IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPKCk7XHJcbiAgICAgICAgICAgIG1vZGVsLmZpbGVJZCA9IGZpbGUuaWQ7XHJcbiAgICAgICAgICAgIG1vZGVsLmlzRmlsZVZlcnNpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZVNlcnZpY2UuZ2VuZXJhdGVMaW5rRG93bmxvYWQobW9kZWwpXHJcbiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLl9maWxlU2VydmljZS5nZXRBbm9ueW1vdXNEb3dubG9hZFVybChyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRvd25sb2FkVXJsKTtcclxuICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgZG93bmxvYWQgbGluaycpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYnJvd3NlRmlsZUZyb21QZXJzb25hbCgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYnJvd3NlRmlsZUZyb21Db21wdXRlcigpIHtcclxuICAgICAgICB0aGlzLmZpbGVFbGVtZW50LmFkdmFuY2VkRmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdEZpbGVGcm9tQ29tcHV0ZXIoZXZ0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGV2dC5maWxlcyAmJiBldnQuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2dC5maWxlcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGV2dC5maWxlc1tpbmRleF0ubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5fY29tbW9uU2VydmljZS5pc0ltYWdlKGZpbGVOYW1lKSA/ICdpbWFnZScgOiAnZmlsZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudEl0ZW06IGFueSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXZ0LmZpbGVzW2luZGV4XSwgZmlsZU5hbWU6IGZpbGVOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRJdGVtLnR5cGUgPT0gJ2ltYWdlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50SXRlbS51cmwgPSBldnQuZmlsZXNbaW5kZXhdLm9iamVjdFVSTC5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmF0dGFjaG1lbnRzLnB1c2goYXR0YWNobWVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIG9uIHByb2Nlc3Mgc2VsZWN0IGZpbGUgY29tcHV0ZXInLCBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRoaXMuZmlsZUVsZW1lbnQuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVBdHRhY2htZW50KGl0ZW0pIHtcclxuICAgICAgICBjb25zdCBpbmQgPSB0aGlzLm1vZGVsLmF0dGFjaG1lbnRzLmZpbmRJbmRleCh4ID0+IHgudXJsID09PSBpdGVtLnVybCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5hdHRhY2htZW50cy5zcGxpY2UoaW5kLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNBdHRhY2htZW50KGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5hdHRhY2htZW50cyAmJiBpdGVtLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZEltZyhldnQsIHBhcmVudEluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLm1vZGVsLmltZ1tgJHtwYXJlbnRJbmRleH0ke2luZGV4fWBdID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1vZGVsLmltZ1tgJHtwYXJlbnRJbmRleH13aWR0aCR7aW5kZXh9YF0gPSAoZXZ0LnRhcmdldC53aWR0aCArIDMyKSArICdweCc7XHJcbiAgICB9XHJcblxyXG4gICAgaW5UaGVTYW1lVGltZShpOiBudW1iZXIsIGl0ZW06IGFueSwgZGF0YVNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgaWYgKGkgPCBkYXRhU291cmNlLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgY29uc3QgZDEgPSBuZXcgRGF0ZShkYXRhU291cmNlW2kgKyAxXS5jcmVhdGVkKTtcclxuICAgICAgICAgICAgY29uc3QgZDIgPSBuZXcgRGF0ZShpdGVtLmNyZWF0ZWQpO1xyXG4gICAgICAgICAgICBjb25zdCBtcyA9IGQxLmdldFRpbWUoKSAtIGQyLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1zIDwgMzAwMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwaW5NZXNzYWdlKGl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLnBpbm5lZE1lc3NhZ2UuaWQgIT0gaXRlbS5pZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKCdC4bqhbiBjw7MgY2jhuq9jIGNo4bqvbiBtdeG7kW4gZ2hpbSB0aW4gbmjhuq9uIG7DoHk/IFRpbiBuaOG6r24gxJHDoyBnaGltIHRyxrDhu5tjIMSRw7Mgc+G6vSDEkcaw4bujYyBi4buPIGdoaW0uJykudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFycykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9QaW4oaXRlbSwgaXRlbS5pZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG9QaW4oaXRlbSwgaXRlbS5pZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRvUGluKGl0ZW0sIGl0ZW0uaWQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkb1BpbihpdGVtLCBpZCwgcGlubmVkKSB7XHJcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgIHRoaXMubW9kZWwuY29ycmVsYXRpb25JZHMucHVzaChjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlQm9hcmRTZXJ2aWNlLnBpbk1lc3NhZ2UoaWQsIHBpbm5lZCwgY29ycmVsYXRpb25JZCkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwaW5uZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGlubmVkTWVzc2FnZSA9IGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBpbm5lZE1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFVzZXJBdmF0YXIoYXZhdGFyOiBhbnkpIHtcclxuICAgICAgICBpZiAoYXZhdGFyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZmlsZUFwaX0vZmlsZS9wdWJsaWMvJHthdmF0YXJ9L0Rvd25sb2FkYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRBdmF0YXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZFBlb3BsZSgpIHtcclxuICAgICAgICB0aGlzLnVzZXJQaWNrZXJGb3JtLnNlbGVjdGVkVmFsdWUgPSB0aGlzLnBlb3BsZVJlbGF0ZWRVc2VycztcclxuICAgICAgICB0aGlzLnVzZXJQaWNrZXJGb3JtLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZTtcclxuICAgICAgICB0aGlzLnVzZXJQaWNrZXJGb3JtLnNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHF1aWNrTm90ZShpdGVtOiBhbnkpIHtcclxuICAgICAgICBjb25zdCB1c2VyUmVzdWx0ID0gYXdhaXQgdGhpcy5fdXNlclNlcnZpY2UuZ2V0QmFzaWNVc2VySW5mbyhpdGVtLmNyZWF0ZWRCeSk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmRhdGEubm90ZURhdGFNb2RlbCA9IDxhbnk+e1xyXG4gICAgICAgICAgICBlZGl0Rm9ybU1vZGVsOiA8YW55PntcclxuICAgICAgICAgICAgICAgIHNob3dFZGl0Rm9ybTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNob3dRdWlja05vdGVGb3JtOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcG9wdXBTaXplOiA8YW55Pnt9LFxyXG4gICAgICAgICAgICAgICAgZGF0YTogPGFueT57XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5jb250ZW50MSxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAnPGI+JyArIHVzZXJSZXN1bHQuZnVsbE5hbWUgKyAnPC9iPicgKyAnIMSRw6MgY2hhdCB04bqhaSBjw7RuZyB2aeG7h2MgJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArICc8Yj4nICsgdGhpcy5tb2RlbC50YXNrTmFtZSArICc8L2I+JyArICcgduG7m2kgbuG7mWkgZHVuZyAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJzxiPicgKyBpdGVtLmNvbnRlbnQxICsgJzwvYj4nICsgJyB2w6BvIGzDumMgJyArIG1vbWVudChuZXcgRGF0ZShpdGVtLmNyZWF0ZWQpKS5mb3JtYXQoJ1lZWVktTU0tREQgaGg6bW06c3MgQScpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMubW9kZWwuZWRpdEZvcm1Nb2RlbC5zaG93UXVpY2tOb3RlRm9ybSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93QWRkTm90ZUZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTW91c2VVcChldmVudCkge1xyXG4gICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ2xhc3NUb01lc3NhZ2UoaXRlbTogYW55LCBpc1Bpbm5lZE1lc3NhZ2U6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBzdHlsZUNsYXNzID0gJyc7XHJcbiAgICAgICAgaWYgKCFpc1Bpbm5lZE1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uaXNGaXJzdE1lc3NhZ2VGbG93KSB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzID0gJ2ZpcnN0JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChpdGVtLmlzTGFzdE1lc3NhZ2VGbG93KSB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzID0gJ2xhc3QnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcyA9ICdtaWRkbGUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnNlbnQgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgc3R5bGVDbGFzcyA9ICdzZW5kaW5nJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0eWxlQ2xhc3M7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhc2hib2FyZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNoYXRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaW5mb1wiPlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDpcIj5Dw7Mge3twZW9wbGVBbGwubGVuZ3RofX0gbmfGsOG7nWkgdHJvbmcgbmjDs20gbsOgeTwvYT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZUJ1dHRvblwiIHBUb29sdGlwPVwiWGVtIHRvw6BuIGLhu5kgxJHDrW5oIGvDqG1cIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OlwiPjxpIGNsYXNzPVwiZmFyIGZhLWltYWdlc1wiPjwvaT48L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IChjbGljayk9XCJhZGRQZW9wbGUoKVwiIGNsYXNzPVwiY2lyY2xlQnV0dG9uXCIgcFRvb2x0aXA9XCJUaMOqbSBt4bubaSBuZ8aw4budaSB2w6BvIG5ow7NtXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6XCI+PGkgY2xhc3M9XCJmYXMgZmEtdXNlci1wbHVzXCI+PC9pPjwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHVsICNzY3JvbGxNZSBbbmdDbGFzc109XCJ7J2hhc1Bpbic6IG1vZGVsLnBpbm5lZE1lc3NhZ2UgIT0gbnVsbH1cIj5cclxuICAgICAgICAgICAgPGxpICpuZ0lmPVwibW9kZWwucGlubmVkTWVzc2FnZVwiIGNsYXNzPVwiY2xlYXJmaXggcGluXCIgW25nQ2xhc3NdPVwieydtZXNzYWdlLWZyb20nOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwibWVzc2FnZUl0ZW07IGNvbnRleHQ6IHsgaSA6IC0xLCBpdGVtOiBtb2RlbC5waW5uZWRNZXNzYWdlLCBpc1Bpbm5lZE1lc3NhZ2U6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1vZGVsLmRhdGFTb3VyY2U7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGdW5jXCIgY2xhc3M9XCJjbGVhcmZpeFwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdtZXNzYWdlLW93bic6IGl0ZW0udHlwZSA9PSAnb3duJ31cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXNzYWdlSXRlbTsgY29udGV4dDogeyBpIDogaSwgaXRlbTogaXRlbX1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgICAgPCEtLSAgICAgICAgPGNoYXQtc2VuZC1tZXNzYWdlLWJveCAqbmdJZj1cInNob3dTZW5kTWVzc2FnZUJveFwiPjwvY2hhdC1zZW5kLW1lc3NhZ2UtYm94Pi0tPlxyXG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyd2aXNpYmxlMic6IG1vZGVsLnNjcm9sbGluZywgJ2hpZGRlbjInOiAhbW9kZWwuc2Nyb2xsaW5nfVwiIGNsYXNzPVwic2Nyb2xsLXRvLWJvdHRvbVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1vZGVsLm5ld01lc3NhZ2VOb3RVcGRhdGVkQ291bnQgPiAwXCIgKGNsaWNrKT1cInNjcm9sbFRvQm90dG9tKDM1MCwgdHJ1ZSwgbnVsbClcIj5cclxuICAgICAgICAgICAgICAgIHt7bW9kZWwubmV3TWVzc2FnZU5vdFVwZGF0ZWRDb3VudCA8PSA1ID8gbW9kZWwubmV3TWVzc2FnZU5vdFVwZGF0ZWRDb3VudCA6ICc1KycgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJzY3JvbGxUb0JvdHRvbSgzNTAsIHRydWUsIG51bGwpXCIgKm5nSWY9XCJtb2RlbC5uZXdNZXNzYWdlTm90VXBkYXRlZENvdW50ID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxmaWxlLXZpZXdlciAqbmdJZj1cImZpbGVWaWV3ZXJNb2RlbC5zaG93RWRpdEZvcm1cIiBbcGFyZW50Q29udGV4dF09XCJjb250ZXh0XCIgW3BhcmVudE1vZGVsXT1cIm1vZGVsXCJcclxuICAgIFttb2RlbF09XCJmaWxlVmlld2VyTW9kZWxcIj5cclxuPC9maWxlLXZpZXdlcj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZUl0ZW0gbGV0LWk9XCJpXCIgbGV0LWlzUGlubmVkTWVzc2FnZT1cImlzUGlubmVkTWVzc2FnZVwiIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgPGltZyAqbmdJZj1cIml0ZW0uaXNGaXJzdE1lc3NhZ2VGbG93ICYmIGl0ZW0udHlwZSAhPSAnb3duJyAmJiAhaXNQaW5uZWRNZXNzYWdlICYmIGl0ZW0uYXZhdGFyICE9IG51bGxcIiBhbHQ9XCJcIlxyXG4gICAgICAgIGNsYXNzPVwiY2hhdC1hdmF0YXJcIiBzcmM9XCJ7e2dldEN1cnJlbnRVc2VyQXZhdGFyKGl0ZW0uYXZhdGFyKX19XCI+XHJcbiAgICA8cCAqbmdJZj1cIihpdGVtLmlzRmlyc3RNZXNzYWdlRmxvdyAmJiBpdGVtLnR5cGUgIT0gJ293bicpICYmICFpc1Bpbm5lZE1lc3NhZ2VcIiBjbGFzcz1cIm1lc3NhZ2UtY3JlYXRlZC1ieVwiPlxyXG4gICAgICAgIHt7aXRlbS5mdWxsTmFtZX19XHJcbiAgICA8L3A+XHJcbiAgICA8c3BhbiAqbmdJZj1cIiFoYXNBdHRhY2htZW50KGl0ZW0pXCI+XHJcbiAgICAgICAgPCEtLSAgICAgICAgICBbY2xhc3NdPVwiYWRkQ2xhc3NUb01lc3NhZ2UoaXRlbSwgaXNQaW5uZWRNZXNzYWdlKVwiPi0tPlxyXG4gICAgICAgIDxwICpuZ0lmPVwiIWhhc0F0dGFjaG1lbnQoaXRlbSlcIiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICA8aSAoY2xpY2spPVwicGluTWVzc2FnZShpdGVtKVwiIGNsYXNzPVwiZmFzIGZhLXRodW1idGFja1wiIHN0eWxlPVwicmlnaHQ6IDA7XCI+PC9pPlxyXG4gICAgICAgICAgICA8aSAoY2xpY2spPVwicXVpY2tOb3RlKGl0ZW0pXCIgY2xhc3M9XCJmYXMgZmEtc3RpY2t5LW5vdGVcIj48L2k+XHJcbiAgICAgICAgICAgIHt7aXRlbS5jb250ZW50fX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHAgKm5nSWY9XCIhaXNQaW5uZWRNZXNzYWdlICYmIChpdGVtLmlzTGFzdE1lc3NhZ2VGbG93IHx8ICFpblRoZVNhbWVUaW1lKGksIGl0ZW0sIG1vZGVsLmRhdGFTb3VyY2UpKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibWVzc2FnZS1jcmVhdGVkXCIgcFRvb2x0aXA9XCJ7e2l0ZW0uY3JlYXRlZCB8IGRhdGU6J2RkL01NL3l5eXkgSEg6bW0nfX1cIlxyXG4gICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ7e2l0ZW0udHlwZSAhPSAnb3duJz8ncmlnaHQnOidsZWZ0J319XCI+XHJcbiAgICAgICAgICAgIHt7X2NydWRTZXJ2aWNlLnJlbmRlckRhdGVUaW1lKGl0ZW0uY3JlYXRlZCl9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgICA8cCAqbmdJZj1cImlzUGlubmVkTWVzc2FnZVwiIGNsYXNzPVwibWVzc2FnZS1jcmVhdGVkXCI+XHJcbiAgICAgICAgICAgIHt7aXRlbS5jcmVhdGVkQnl9fSDEkcOjIGfhu61pIGzDumMge3tpdGVtLmNyZWF0ZWQgfCBkYXRlOidkZC9NTS95eXl5IEhIOm1tJ319XHJcbiAgICAgICAgPC9wPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0F0dGFjaG1lbnQoaXRlbSlcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhdHRhY2htZW50SXRlbSBvZiBpdGVtLmF0dGFjaG1lbnRzO2xldCBpbmRleD1pbmRleFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZpcnN0JzppdGVtLmlzRmlyc3RNZXNzYWdlRmxvdyAmJiBpbmRleCA9PSAwLCAnbWlkZGxlJzppbmRleCA+IDAgfHwgIWl0ZW0uaXNGaXJzdE1lc3NhZ2VGbG93LCAnaW1hZ2UnIDogYXR0YWNobWVudEl0ZW0udHlwZSA9PSAnaW1hZ2UnfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzogbW9kZWwuaW1nW2kgKyAnd2lkdGgnICsgaW5kZXhdfVwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhdHRhY2htZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKG1vdXNldXApPVwib25Nb3VzZVVwKCRldmVudClcIiBjbGFzcz1cImF0dGFjaG1lbnQtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cImF0dGFjaG1lbnRJdGVtLnR5cGUgIT0gJ2ltYWdlJ1wiIChjbGljayk9XCJ2aWV3T3JEb3dubG9hZEZpbGUoJGV2ZW50LCBhdHRhY2htZW50SXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBhcGVyY2xpcFwiPjwvaT57e2F0dGFjaG1lbnRJdGVtLmZpbGVOYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cImF0dGFjaG1lbnRJdGVtLnR5cGUgPT0gJ2ltYWdlJ1wiICNhRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydoaWRkZW4nOiAhbW9kZWwuaW1nW2kgKyAnJyArIGluZGV4XSwgJ3Zpc2libGUnOm1vZGVsLmltZ1tpICsgJycgKyBpbmRleF19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3T3JEb3dubG9hZEZpbGUoJGV2ZW50LCBhdHRhY2htZW50SXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJtZXNzYWdlLWltZ1wiIChsb2FkKT1cImxvYWRJbWcoJGV2ZW50LCBpLCBpbmRleClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYXR0YWNobWVudEl0ZW0udXJsIHwgc2VjdXJlIHwgYXN5bmNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNsZWFyOiBib3RoXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1lc3NhZ2UtY3JlYXRlZFwiIHBUb29sdGlwPVwie3tpdGVtLmNyZWF0ZWQgfCBkYXRlOidkZC9NTS95eXl5IEhIOm1tJ319XCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ7e2l0ZW0udHlwZSAhPSAnb3duJz8ncmlnaHQnOidsZWZ0J319XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tfY3J1ZFNlcnZpY2UucmVuZGVyRGF0ZVRpbWUoaXRlbS5jcmVhdGVkKX19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6IGJvdGhcIj48L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPGFmdGVyLXZpZXctY2hlY2tlZCAqbmdJZj1cIm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoID09IGkgKyAxXCIgKGxvYWRpbmcpPVwic2Nyb2xsVG9Cb3R0b20oMCwgZmFsc2UsIGl0ZW0uc2VudClcIj5cclxuICAgIDwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLTx0bi1kaWFsb2cgKm5nSWY9XCJ1c2VyUGlja2VyRm9ybS5zaG93XCIgI2RpYWxvZyBbc3R5bGVDbGFzc109XCIndG4tZm9ybS1kaWFsb2cnXCItLT5cclxuPCEtLSAgICAgICAgICAgW2hlYWRlcl09XCInVGjDqm0gbeG7m2kgbmfGsOG7nWkgZMO5bmcnIHwgdHJhbnNsYXRlXCIgW3BvcHVwU2l6ZV09XCJ1c2VyUGlja2VyRm9ybS5wb3B1cFNpemVcIi0tPlxyXG48IS0tICAgICAgICAgICAob25DYW5jZWwpPVwidXNlclBpY2tlckZvcm0uc2hvdyA9IGZhbHNlXCItLT5cclxuPCEtLSAgICAgICAgICAgKG9uSGlkZSk9XCJ1c2VyUGlja2VyRm9ybS5zaG93ID0gZmFsc2VcIj4tLT5cclxuPCEtLSAgICAmbHQ7ISZuZGFzaDsgICAgPGNvbmd2aWVjLWZvcm0gI2Zvcm1CYXNlIFtwYXJlbnRNb2RlbF09XCJtb2RlbFwiIFtwYXJlbnRDb250ZXh0XT1cImNvbnRleHRcIiBbbW9kZWxdPVwiZm9ybU1vZGVsXCImbmRhc2g7Jmd0Oy0tPlxyXG48IS0tICAgICZsdDshJm5kYXNoOyAgICAgICAgICAgICAgICAgICAob25TYXZlZCk9XCJzaG93RGV0YWlsRm9ybSA9IGZhbHNlO2NydWRMaXN0LnJlbG9hZCgpXCIgKG9uQ2FuY2VsKT1cIl9oYW5kbGVDYW5jZWwoJGV2ZW50KVwiJm5kYXNoOyZndDstLT5cclxuPCEtLSAgICAmbHQ7ISZuZGFzaDsgICAgICAgICAgICAgICAgICAgKG9uQWZ0ZXJTYXZlZCk9XCJvbkFmdGVyU2F2ZWQoJGV2ZW50KVwiPjwvY29uZ3ZpZWMtZm9ybT4mbmRhc2g7Jmd0Oy0tPlxyXG48IS0tICAgIDx1c2VyLXBpY2tlci1ib3ggI2Zvcm1CYXNlIFtjb250cm9sXT1cInVzZXJQaWNrZXJDb250cm9sXCItLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGhpcy5wZW9wbGVBbGxcIiBbbXVsdGlwbGVdPVwidXNlclBpY2tlckNvbnRyb2wubXVsdGlwbGVcIj4tLT5cclxuPCEtLSAgICA8L3VzZXItcGlja2VyLWJveD4tLT5cclxuPCEtLTwvdG4tZGlhbG9nPi0tPlxyXG5cclxuXHJcbjwhLS08dG4tZGlhbG9nICpuZ0lmPVwidXNlclBpY2tlckZvcm0uc2hvd1wiICNkaWFsb2cgW3N0eWxlQ2xhc3NdPVwiJ3RuLWZvcm0tZGlhbG9nJ1wiLS0+XHJcbjwhLS0gICAgICAgICAgIFtoZWFkZXJdPVwiJ1Row6ptIG3hu5tpIG5nxrDhu51pIGTDuW5nJyB8IHRyYW5zbGF0ZVwiIFtwb3B1cFNpemVdPVwidXNlclBpY2tlckZvcm0ucG9wdXBTaXplXCIgKG9uSGlkZSk9XCJ1c2VyUGlja2VyRm9ybS5zaG93ID09IGZhbHNlXCI+LS0+XHJcbjwhLS0gICAgJmx0OyEmbmRhc2g7ICAgIDxjb25ndmllYy1mb3JtICNmb3JtQmFzZSBbcGFyZW50TW9kZWxdPVwibW9kZWxcIiBbcGFyZW50Q29udGV4dF09XCJjb250ZXh0XCIgW21vZGVsXT1cImZvcm1Nb2RlbFwiJm5kYXNoOyZndDstLT5cclxuPCEtLSAgICAmbHQ7ISZuZGFzaDsgICAgICAgICAgICAgICAgICAgKG9uU2F2ZWQpPVwic2hvd0RldGFpbEZvcm0gPSBmYWxzZTtjcnVkTGlzdC5yZWxvYWQoKVwiIChvbkNhbmNlbCk9XCJfaGFuZGxlQ2FuY2VsKCRldmVudClcIiZuZGFzaDsmZ3Q7LS0+XHJcbjwhLS0gICAgJmx0OyEmbmRhc2g7ICAgICAgICAgICAgICAgICAgIChvbkFmdGVyU2F2ZWQpPVwib25BZnRlclNhdmVkKCRldmVudClcIj48L2Nvbmd2aWVjLWZvcm0+Jm5kYXNoOyZndDstLT5cclxuXHJcbjwhLS0gICAgJmx0OyEmbmRhc2g7PHF1aWNrLWFkZC1mb3JtICpuZ0lmPVwibW9kZWwuZWRpdEZvcm1Nb2RlbC5zaG93UXVpY2tOb3RlRm9ybVwiIFtwYXJlbnRDb250ZXh0XT1cImNvbnRleHRcIiZuZGFzaDsmZ3Q7LS0+XHJcbjwhLS0gICAgJmx0OyEmbmRhc2g7ICAgICAgICAgICAgICAgIFtwYXJlbnRNb2RlbF09XCJjb250ZXh0LmRhdGEubm90ZURhdGFNb2RlbFwiPjwvcXVpY2stYWRkLWZvcm0+Jm5kYXNoOyZndDstLT5cclxuPCEtLTwvdG4tZGlhbG9nPi0tPiJdfQ==
607
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9jaGF0L2NoYXQtYm94L2NoYXQtYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC9jaGF0LWJveC9jaGF0LWJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF3QixLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFOUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFNN0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFHaEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNN0YscUJBQXFCO0FBQ3JCLDBCQUEwQjtBQVExQixNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsYUFBYTtJQTJDL0MsWUFDSSxRQUFrQixFQUNWLFlBQXlCLEVBQ3pCLG9CQUF5QyxFQUN6QyxZQUF5QixFQUN6QixvQkFBZ0QsRUFDaEQsZUFBK0IsRUFDL0IsWUFBaUMsRUFDbEMsWUFBeUIs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Q0k7Z0JBQ0QsVUFBVSxHQUFHLFFBQVEsQ0FBQzthQUN6QjtTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBRTtZQUNwQixVQUFVLEdBQUcsU0FBUyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQzs7NkdBN29CUSxnQkFBZ0I7aUdBQWhCLGdCQUFnQix5S0FGZCxDQUFDLHVCQUF1QixFQUFFLDBCQUEwQixDQUFDLDhPQzlCcEUsMGxQQWlIbUI7MkZEakZOLGdCQUFnQjtrQkFONUIsU0FBUzsrQkFDSSxVQUFVLGFBR1QsQ0FBQyx1QkFBdUIsRUFBRSwwQkFBMEIsQ0FBQztzWEFHdkQsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRWMsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPO2dCQUNRLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2ZpbGV1cGxvYWQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgUG9wdXBTaXplLCBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgVG5Vc2VyIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RuLXVzZXInO1xyXG5pbXBvcnQgeyBDaGVja0NvbnRyb2xWaXNpYmxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoZWNrLWNvbnRyb2wtdmlzaWJsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jcnVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNpZ25hbFJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc2lnbmFsci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTyB9IGZyb20gJy4uLy4uL2ZpbGUtZXhwbG9yZXIvbW9kZWxzL2dlbmVyYXRlLWxpbmstZG93bmxvYWQtZHRvJztcclxuaW1wb3J0IHsgU2VydmljZVJlcXVlc3RNb2RlbCB9IGZyb20gJy4uLy4uL2ZpbGUtZXhwbG9yZXIvbW9kZWxzL3NlcnZpY2UtcmVxdWVzdC1tb2RlbCc7XHJcbmltcG9ydCB7IEZpbGVFeHBsb3JlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9maWxlLWV4cGxvcmVyL3NlcnZpY2VzL2ZpbGUtZXhwbG9yZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VUeXBlLCBORVdfTUVTU0FHRSwgTm90aWZpY2F0aW9uVHlwZSwgUElOTkVEX0NIQU5HRUQgfSBmcm9tICcuLi9tb2RlbHMvZW51bXMnO1xyXG5pbXBvcnQgeyBFZGl0Rm9ybU1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL21vZGVscyc7XHJcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2hhdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVzc2FnZUJvYXJkU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21lc3NhZ2UtYm9hcmQuc2VydmljZSc7XHJcblxyXG5cclxuLy8gZml4IGZvciBidWlsZCBwcm9kXHJcbi8vIGNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY2hhdC1ib3gnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtYm94LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NoYXQtYm94LmNvbXBvbmVudC5zY3NzJywgJy4uL2NvbW1vbi1zdHlsZS5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtDb21wb25lbnRDb250ZXh0U2VydmljZSwgQ2hlY2tDb250cm9sVmlzaWJsZVNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0Qm94Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBJbnB1dCgpIHRhc2tJZDogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgc2VydmljZUNvZGU6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIGVudGl0eTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgdXNlcnM6IGFueTtcclxuICAgIEBJbnB1dCgpIHNob3dTZW5kTWVzc2FnZUJveDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2ZpbGVFbGVtZW50JykgZmlsZUVsZW1lbnQ6IEZpbGVVcGxvYWQ7XHJcblxyXG4gICAgcmVhZG9ubHkgZGVmYXVsdEF2YXRhcjtcclxuXHJcbiAgICB1c2VyUGlja2VyRm9ybTogRWRpdEZvcm1Nb2RlbCA9IHtcclxuICAgICAgICBzZWxlY3RlZFZhbHVlOiBbXSxcclxuICAgICAgICBkYXRhOiBudWxsLFxyXG4gICAgfTtcclxuICAgIHVzZXJQaWNrZXJDb250cm9sOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYTtcclxuICAgIGZpbGVWaWV3ZXJNb2RlbDoge1xyXG4gICAgICAgIGRhdGE6IGFueSxcclxuICAgICAgICBzaG93RWRpdEZvcm06IGJvb2xlYW4sXHJcbiAgICB9O1xyXG5cclxuICAgIHRvcGljID0gJyc7XHJcbiAgICBmaXJzdFRpbWUgPSB0cnVlO1xyXG4gICAgbXVsdGlwbGUgPSB0cnVlO1xyXG4gICAgc2hvd0FkZE5vdGVGb3JtID0gZmFsc2U7XHJcbiAgICBmaWxlQXBpID0gJyc7XHJcbiAgICBwZW9wbGVBbGw6IGFueSA9IFtdO1xyXG4gICAgY29ycmVsYXRpb25JZHMgPSBbXTtcclxuICAgIGF0dGFjaG1lbnRzID0gW107XHJcbiAgICBpbWFnZSA9ICcnO1xyXG4gICAgcGVvcGxlQWxsVXNlcnMgPSBbXTtcclxuICAgIHBlb3BsZVJlbGF0ZWRVc2VycyA9IFtdO1xyXG4gICAgZWRpdEZvcm1Nb2RlbCA9IHt9O1xyXG5cclxuICAgIHNlcnZpY2VSZXF1ZXN0TW9kZWw6IFNlcnZpY2VSZXF1ZXN0TW9kZWw7XHJcbiAgICBjdXJyZW50VXNlcjogVG5Vc2VyO1xyXG4gICAgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICAgIC8vIGZpbGVWaWV3ZXI6IGFueTtcclxuICAgIGFzc2lnbmVlOiBhbnk7XHJcbiAgICBhc3NpZ25lcjogYW55O1xyXG4gICAgcmVsYXRlZFVzZXI6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBfY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX21lc3NhZ2VCb2FyZFNlcnZpY2U6IE1lc3NhZ2VCb2FyZFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2NoZWNrQ29udHJvbFZpc2libGU6IENoZWNrQ29udHJvbFZpc2libGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3NpZ25hbHJTZXJ2aWNlOiBTaWduYWxSU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9maWxlU2VydmljZTogRmlsZUV4cGxvcmVyU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9lbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEF2YXRhciA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXREZWZhdWx0TWFsZUF2YXRhcigpO1xyXG4gICAgICAgIHRoaXMuZmlsZUFwaSA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRIdHRwU2VydmljZUVuZHBvaW50KCdmaWxlJyk7XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWwudXNlclBpY2tlckZvcm0gPSB7IHBvcHVwU2l6ZTogUG9wdXBTaXplLCBkYXRhOiB7fSB9O1xyXG4gICAgICAgIHRoaXMubW9kZWwucXVpY2tOb3RlRm9ybSA9IHsgcG9wdXBTaXplOiA8YW55Pnt9LCBkYXRhOiB7fSB9O1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRleHQuc3Vic2NyaWJlKCdRVUlDS19OT1RFX1BPUFVQLkNMT1NFX1BPUFVQJywgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmVkaXRGb3JtTW9kZWwuc2hvd1F1aWNrTm90ZUZvcm0gPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVVc2Vycyhhc3NpZ25lZTogYW55LCBhc3NpZ25lcjogYW55LCByZWxhdGVkVXNlcjogYW55W10pIHtcclxuICAgICAgICB0aGlzLmFzc2lnbmVlID0gYXNzaWduZWU7XHJcbiAgICAgICAgdGhpcy5hc3NpZ25lciA9IGFzc2lnbmVyO1xyXG4gICAgICAgIHRoaXMucmVsYXRlZFVzZXIgPSByZWxhdGVkVXNlcjtcclxuICAgICAgICBsZXQgYWxsID0gW107XHJcbiAgICAgICAgYWxsLnB1c2goYXNzaWduZWUpO1xyXG4gICAgICAgIGFsbC5wdXNoKGFzc2lnbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5yZWxhdGVkVXNlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGFsbCA9IGFsbC5jb25jYXQocmVsYXRlZFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBlb3BsZUFsbCA9IGFsbC5maWx0ZXIoKHgsIGksIGEpID0+IGEuaW5kZXhPZih4KSA9PSBpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmluaXRDbGFzc1ZhcigpO1xyXG5cclxuICAgICAgICB0aGlzLmdldE1lc3NhZ2VzKG51bGwpO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGF0U2VydmljZS5nZXRDaGF0SWRCeVRhc2sodGhpcy5zZXJ2aWNlUmVxdWVzdE1vZGVsLCB0aGlzLnRhc2tJZCkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcnMuc3VjY2VzcykgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKHJzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZiAoIXJzLmRhdGEpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5pZCA9IHJzLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSU5TVEFOQ0VfSURfTE9BREVELCB0aGlzLm1vZGVsLmlkKTtcclxuICAgICAgICAgICAgdGhpcy50b3BpYyA9IGBjaGF0LiR7dGhpcy5tb2RlbC5pZH1gO1xyXG4gICAgICAgICAgICB0aGlzLl9zaWduYWxyU2VydmljZS5zdGFydChudWxsLCB0aGlzLnRvcGljLCBkYXRhID0+IHRoaXMuaGFuZGxlQ2hhbmdlcyhkYXRhKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgcGlubmVkIG1lc3NhZ2VcclxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VCb2FyZFNlcnZpY2UuZ2V0TGF0ZXN0UGlubmVkTWVzc2FnZSh0aGlzLm1vZGVsLmlkKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocnMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBpbm5lZE1lc3NhZ2UgPSBycy5kYXRhLmNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9NRVNTQUdFX1NFTkRJTkcsIGFzeW5jIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLnB1c2goZGF0YS5tZXNzYWdlLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5hdHRhY2htZW50cyAmJiBkYXRhLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGRhdGEuYXR0YWNobWVudHMgPSBkYXRhLmF0dGFjaG1lbnRzLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB4LnVybCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdGVtcCA9IGF3YWl0IHRoaXMuYXBwZW5kTWVzc2FnZShkYXRhLm1lc3NhZ2UubWVzc2FnZUNvbnRlbnQsICdvd24nLCAnc2VuZGluZycsIHRoaXMuY3VycmVudFVzZXIudXNlck5hbWUsIGRhdGEuYXR0YWNobWVudHMsIGRhdGEubWVzc2FnZS5jb3JyZWxhdGlvbklkLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRlbXApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5DSEFUX01FU1NBR0VfU0VOVCwgZGF0YSA9PiB7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTE9BRF9NT1JFLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgLy8gdGhpcy5nZXRNZXNzYWdlcyh0aGlzLm1vZGVsLmNyZWF0ZWRGcm9tKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9TQ1JPTExJTkcsIHNjcm9sbGluZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzY3JvbGxpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2Nyb2xsaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2Nyb2xsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLm5ld01lc3NhZ2VOb3RVcGRhdGVkQ291bnQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSEFTX05FV19NRVNTQUdFX05PVF9VUERBVEVELCBjb3VudCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2Nyb2xsaW5nID0gY291bnQgIT09IDA7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwubmV3TWVzc2FnZU5vdFVwZGF0ZWRDb3VudCA9IGNvdW50O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRleHQuc3Vic2NyaWJlKCdDTE9TRV9QT1BVUCcsIHJzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC51c2VyUGlja2VyRm9ybS5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Q29udGV4dC5maXJlRXZlbnQoJ1RBU0suUkVMQVRFRF9VU0VSX0NIQU5HRUQnLCBycyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50Q29udGV4dC5zdWJzY3JpYmUoJ1RBU0suREFUQV9DSEFOR0VEJywgcnMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJzKHJzLmFzc2lnbmVlLCBycy5hc3NpZ25lciwgcnMucmVsYXRlZFVzZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2hhbmdlcyhkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZSA9IEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgaWYgKCFuZXdNZXNzYWdlIHx8ICFuZXdNZXNzYWdlLmRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTWVNfRVJSX0RFVjogTOG7l2kgU2lnbmFsUicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKG5ld01lc3NhZ2Uubm90aWZpY2F0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuTmV3TWVzc2FnZTpcclxuICAgICAgICAgICAgY2FzZSBORVdfTUVTU0FHRToge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKG5ld01lc3NhZ2UuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuUGlubmVkQ2hhbmdlZDpcclxuICAgICAgICAgICAgY2FzZSBQSU5ORURfQ0hBTkdFRDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kID0gdGhpcy5tb2RlbC5jb3JyZWxhdGlvbklkcy5maW5kSW5kZXgoeCA9PiB4ID09IG5ld01lc3NhZ2UuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLnNwbGljZShpbmQsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVQaW5uZWRDaGFuZ2VOb3RpZmljYXRpb24obmV3TWVzc2FnZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdENsYXNzVmFyKCkge1xyXG4gICAgICAgIHRoaXMuZmlsZVZpZXdlck1vZGVsID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7fSxcclxuICAgICAgICAgICAgc2hvd0VkaXRGb3JtOiBmYWxzZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMudXNlclBpY2tlckNvbnRyb2wgPSBuZXcgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICBmaWVsZDogJ2lkJyxcclxuICAgICAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgICAgICBmdWxsTGFiZWw6ICcnLFxyXG4gICAgICAgICAgICBtdWx0aXBsZTogdHJ1ZSxcclxuICAgICAgICAgICAgaGlkZGVuQ2hlY2s6ICgpID0+IHRoaXMudXNlclBpY2tlckZvcm0uc2hvdyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNlcnZpY2VSZXF1ZXN0TW9kZWwgPSA8U2VydmljZVJlcXVlc3RNb2RlbD57XHJcbiAgICAgICAgICAgIHNlcnZpY2U6IHRoaXMuc2VydmljZUNvZGUsXHJcbiAgICAgICAgICAgIHNlcnZpY2VDb2RlOiB0aGlzLnNlcnZpY2VDb2RlLFxyXG4gICAgICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5LFxyXG4gICAgICAgICAgICBlbnRpdHlLZXk6ICdpZCcsXHJcbiAgICAgICAgICAgIGVudGl0eUluc3RhbmNlSWQ6IHRoaXMudGFza0lkXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UgPSBbXTtcclxuICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzID0gW107XHJcbiAgICAgICAgdGhpcy5tb2RlbC5hdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMubW9kZWwubWF4RmlsZVNpemUgPSAzMDAwMDAwO1xyXG4gICAgICAgIHRoaXMubW9kZWwuaW1nID0ge307XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5wZW9wbGVBbGxVc2VycyA9IFtdO1xyXG4gICAgICAgIHRoaXMucGVvcGxlUmVsYXRlZFVzZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5tb2RlbC5lZGl0Rm9ybU1vZGVsID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMudXNlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC50YXNrTmFtZSA9IHRoaXMudXNlcnMudGFza05hbWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy51c2Vycy5hc3NpZ25lZSxcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlcnMuYXNzaWduZXIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJzLnJlbGF0ZWRVc2Vyc1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nZXRSZWxhdGVkVXNlckluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0UmVsYXRlZFVzZXJJbmZvKCkge1xyXG4gICAgICAgIGNvbnN0IHBlb3BsZVJlbGF0ZWRVc2VycyA9IGF3YWl0IHRoaXMuX3VzZXJTZXJ2aWNlLmdldEJhc2ljVXNlcnNJbmZvKHRoaXMucmVsYXRlZFVzZXIuam9pbigpKTtcclxuICAgICAgICBpZiAocGVvcGxlUmVsYXRlZFVzZXJzID09IG51bGwgfHwgcGVvcGxlUmVsYXRlZFVzZXJzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBlb3BsZVJlbGF0ZWRVc2Vycykge1xyXG4gICAgICAgICAgICB0aGlzLnBlb3BsZVJlbGF0ZWRVc2Vycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLmZ1bGxOYW1lLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0uZnVsbE5hbWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5pZFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlUGlubmVkQ2hhbmdlTm90aWZpY2F0aW9uKGRhdGEpIHtcclxuICAgICAgICBpZiAoZGF0YS5waW5uZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlTmV3TWVzc2FnZU5vdGlmaWNhdGlvbihuZXdNZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc3QgaW5kID0gdGhpcy5tb2RlbC5jb3JyZWxhdGlvbklkcy5maW5kSW5kZXgoeCA9PiB4ID09IG5ld01lc3NhZ2UuY29ycmVsYXRpb25JZCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdNZXNzYWdlLm1lc3NhZ2VUeXBlID09IE1lc3NhZ2VUeXBlLkZJTEUpIHtcclxuICAgICAgICAgICAgbmV3TWVzc2FnZS5hdHRhY2htZW50cyA9IGF3YWl0IHRoaXMuX2NoYXRTZXJ2aWNlLmdldExpc3RBdHRhY2htZW50KG5ld01lc3NhZ2UuaWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBlbmRNZXNzYWdlKG5ld01lc3NhZ2UuY29udGVudCwgdGhpcy5nZXRUeXBlT2ZNZXNzYWdlKG5ld01lc3NhZ2UuY3JlYXRlZEJ5KSwgJ3JlY2VpdmVkJywgbmV3TWVzc2FnZS5jcmVhdGVkQnksIG5ld01lc3NhZ2UuYXR0YWNobWVudHMsICcnLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTWVzc2FnZShuZXdNZXNzYWdlLmNvcnJlbGF0aW9uSWQsIG5ld01lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLnNwbGljZShpbmQsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRNZXNzYWdlcyhjcmVhdGVkRnJvbSkge1xyXG4gICAgICAgIHRoaXMuX2NoYXRTZXJ2aWNlLmdldENvbnRlbnRCeVRhc2tJZCh0aGlzLnNlcnZpY2VSZXF1ZXN0TW9kZWwsIHRoaXMudGFza0lkKS50aGVuKGFzeW5jIHJzID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFVzZXJOYW1lID0gdGhpcy5jdXJyZW50VXNlci51c2VyTmFtZTtcclxuICAgICAgICAgICAgbGV0IG5lYXJCeUNyZWF0ZWQgPSAnJztcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgbGV0IHVzZXJOYW1lczogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgICAgIGlmICghcnMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhycy5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcnMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY3JlYXRlZEJ5ICYmIGl0ZW0uY3JlYXRlZEJ5ICE9ICcnKSB1c2VyTmFtZXMgKz0gYCR7aW5kZXggPT0gMCA/ICcnIDogJywnfSR7aXRlbS5jcmVhdGVkQnl9YDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHRoaXMubW9kZWwuY3JlYXRlZEZyb20gPSBpdGVtLmNyZWF0ZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaXRlbS50eXBlID0gaXRlbS5jcmVhdGVkQnkgPT09IGN1cnJlbnRVc2VyTmFtZSA/ICdvd24nIDogJ2Zyb20nO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLm1lc3NhZ2VUeXBlID09PSBNZXNzYWdlVHlwZS5GSUxFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hdHRhY2htZW50cyA9IGF3YWl0IHRoaXMuX2NoYXRTZXJ2aWNlLmdldExpc3RBdHRhY2htZW50KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGl0ZW0uaXNMYXN0TWVzc2FnZUZsb3cgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jcmVhdGVkQnkgIT09IG5lYXJCeUNyZWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK2l0ZW0gPiAtMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBycy5kYXRhWytpdGVtIC0gMV0uaXNMYXN0TWVzc2FnZUZsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBuZWFyQnlDcmVhdGVkID0gaXRlbS5jcmVhdGVkQnk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5pc0ZpcnN0TWVzc2FnZUZsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5pc0ZpcnN0TWVzc2FnZUZsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoK2luZGV4ID09PSBycy5kYXRhLmxlbmd0aCAtIDEpIGl0ZW0uaXNMYXN0TWVzc2FnZUZsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNyZWF0ZWRGcm9tKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UgPSBbLi4ucnMuZGF0YSwgLi4udGhpcy5tb2RlbC5kYXRhU291cmNlXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZSA9IHJzLmRhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJOYW1lcyAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlckluZm9zID0gYXdhaXQgdGhpcy5fdXNlclNlcnZpY2UuZ2V0QmFzaWNVc2Vyc0luZm9CeVVzZXJOYW1lcyh1c2VyTmFtZXMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJJbmZvcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMubW9kZWwuZGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gdXNlckluZm9zLmZpbmQoeCA9PiB4LnVzZXJOYW1lID09IGl0ZW0uY3JlYXRlZEJ5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmF2YXRhciA9IHVzZXIuYXZhdGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmZ1bGxOYW1lID0gdXNlci5mdWxsTmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9EQVRBX0xPQURFRCwgdHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9Cb3R0b20oc3BlZWQgPSAwLCBmb3JjZSA9IGZhbHNlLCBzZW50KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLnNjcm9sbGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5DSEFUX0hBU19ORVdfTUVTU0FHRSwgeyBzcGVlZCwgZm9yY2U6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNlbnQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSEFTX05FV19NRVNTQUdFLCB7IHNwZWVkLCBmb3JjZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYXBwZW5kTWVzc2FnZShtZXNzYWdlLCB0eXBlLCBzdGF0dXMsIGNyZWF0ZWRCeSwgYXR0YWNobWVudHMgPSBbXSwgY29ycmVsYXRpb25JZCA9ICcnLCBzZW50KSB7XHJcbiAgICAgICAgbGV0IGZ1bGxOYW1lID0gJyc7XHJcbiAgICAgICAgbGV0IGF2YXRhciA9ICcnO1xyXG5cclxuICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5fdXNlclNlcnZpY2UuZ2V0QmFzaWNVc2VySW5mb0J5VXNlck5hbWUoY3JlYXRlZEJ5KTtcclxuICAgICAgICBmdWxsTmFtZSA9IHVzZXIuZnVsbE5hbWUgPz8gJyc7XHJcbiAgICAgICAgYXZhdGFyID0gdXNlci5hdmF0YXIgPz8gJyc7XHJcblxyXG4gICAgICAgIGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsb25lZEF0dGFjaG1lbnQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnRzKSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnk6IGNyZWF0ZWRCeSxcclxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiBmdWxsTmFtZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgICAgIGF2YXRhcjogYXZhdGFyLFxyXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudHM6IGNsb25lZEF0dGFjaG1lbnQsXHJcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgaXNGaXJzdE1lc3NhZ2VGbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2VGbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHNlbnQ6IHNlbnRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlyc3RPckxhc3RNZXNzYWdlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlLnRyaW0oKSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEJ5OiBjcmVhdGVkQnksXHJcbiAgICAgICAgICAgICAgICBmdWxsTmFtZTogZnVsbE5hbWUsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiBtZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgYXZhdGFyOiBhdmF0YXIsXHJcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgaXNGaXJzdE1lc3NhZ2VGbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2VGbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHNlbnQ6IHNlbnRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlyc3RPckxhc3RNZXNzYWdlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5kYXRhU291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUZpcnN0T3JMYXN0TWVzc2FnZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlWzBdLmlzRmlyc3RNZXNzYWdlRmxvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2VbbGVuZ3RoIC0gMl0uY3JlYXRlZEJ5O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEJ5MiA9IHRoaXMubW9kZWwuZGF0YVNvdXJjZVtsZW5ndGggLSAxXS5jcmVhdGVkQnk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZEJ5ICE9PSBjcmVhdGVkQnkyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlW2xlbmd0aCAtIDJdLmlzTGFzdE1lc3NhZ2VGbG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2VbbGVuZ3RoIC0gMV0uaXNGaXJzdE1lc3NhZ2VGbG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZVtsZW5ndGggLSAyXS5pc0xhc3RNZXNzYWdlRmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZVtsZW5ndGggLSAxXS5pc0xhc3RNZXNzYWdlRmxvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTWVzc2FnZShjb3JyZWxhdGlvbklkLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMubW9kZWwuZGF0YVNvdXJjZS5maW5kKHggPT4geC5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkKTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXR0YWNobWVudHMgJiYgbWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS5pZCA9IG1lc3NhZ2UuaWQ7XHJcbiAgICAgICAgICAgIGl0ZW0uc2VudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZU1lc3NhZ2VTdGF0dXMobWVzc2FnZSwgc3RhdHVzLCBlcnJvck1lc3NhZ2UgPSAnJykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2UuZmluZCh4ID0+IHgubWVzc2FnZSA9PT0gbWVzc2FnZSk7XHJcbiAgICAgICAgaXRlbS5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgICAgaXRlbS5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGlzcGxheVN0YXR1cyhzdGF0dXMpIHtcclxuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xyXG4gICAgICAgICAgICBjYXNlICdzZW5kaW5nJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnxJBhbmcgZ+G7rWknO1xyXG4gICAgICAgICAgICBjYXNlICdzZW50JzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnxJDDoyBn4butaSc7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIC8vIHVuc2NyaWJsZSBzaWduYWxyXHJcbiAgICAgICAgdGhpcy5fc2lnbmFsclNlcnZpY2UudW5TdWJzY3JpYmVWaWV3Q29kZShudWxsLCB0aGlzLnRvcGljKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTUVTU0FHRV9TRU5ESU5HKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTUVTU0FHRV9TRU5UKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTE9BRF9NT1JFKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfU0NST0xMSU5HKTtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnVuU3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSEFTX05FV19NRVNTQUdFX05PVF9VUERBVEVEKTtcclxuXHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUeXBlT2ZNZXNzYWdlKGNyZWF0ZWRCeSkge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVkQnkgPT09IHRoaXMuY3VycmVudFVzZXIudXNlck5hbWUgPyAnb3duJyA6ICdmcm9tJztcclxuICAgIH1cclxuXHJcbiAgICB0cmFja0J5RnVuYyhpbmRleCwgaXRlbSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHRyYWNrQXR0YWNobWVudEJ5RnVuYyhpbmRleCwgaXRlbSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmZpbGVOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdERhdGEgPSB0aGlzLmdldEltYWdlQ2xpcGJvYXJkRGF0YShldmVudCk7XHJcbiAgICAgICAgaWYgKG9iamVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5hdHRhY2htZW50cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsXHJcbiAgICAgICAgICAgICAgICB1cmw6IG9iamVjdERhdGEudXJsLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogb2JqZWN0RGF0YS5ibG9iLFxyXG4gICAgICAgICAgICAgICAgZmlsZU5hbWU6IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpICsgJy5wbmcnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbWFnZUNsaXBib2FyZERhdGEoZSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZS5jbGlwYm9hcmREYXRhLml0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlLmNsaXBib2FyZERhdGEuaXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUuaW5kZXhPZignaW1hZ2UnKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VPYmogPSBpdGVtLmdldEFzRmlsZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGltYWdlT2JqLnNpemUgPCB0aGlzLm1vZGVsLm1heEZpbGVTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdXJsOiBVUkwuY3JlYXRlT2JqZWN0VVJMKGltYWdlT2JqKSwgYmxvYjogaW1hZ2VPYmogfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB2aWV3T3JEb3dubG9hZEZpbGUoZXZ0LCBhdHRhY2htZW50SXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9maWxlU2VydmljZS5pc1N1cHBvcnRlZFZpZXdPbmxpbmUoYXR0YWNobWVudEl0ZW0uZmlsZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubW9kZWwuZmlsZVZpZXdlci5kYXRhID0ge307XHJcbiAgICAgICAgICAgIC8vIHRoaXMubW9kZWwuZmlsZVZpZXdlci5kYXRhLmZpbGVJZCA9IGF0dGFjaG1lbnRJdGVtLmlkO1xyXG4gICAgICAgICAgICAvLyB0aGlzLm1vZGVsLmZpbGVWaWV3ZXIuZGF0YS5maWxlTmFtZSA9IGF0dGFjaG1lbnRJdGVtLmZpbGVOYW1lO1xyXG4gICAgICAgICAgICAvLyB0aGlzLm1vZGVsLmZpbGVWaWV3ZXIuZGF0YS5pc0ZpbGVWZXJzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubW9kZWwuZmlsZVZpZXdlci5zaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5maWxlVmlld2VyTW9kZWwgPSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBhdHRhY2htZW50SXRlbS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogYXR0YWNobWVudEl0ZW0uZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNGaWxlVmVyc2lvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2hvd0VkaXRGb3JtOiB0cnVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdG9wLmxvY2F0aW9uLmhyZWYgPSBhd2FpdCB0aGlzLmRvd25sb2FkKGF0dGFjaG1lbnRJdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkKGZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gbmV3IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPKCk7XHJcbiAgICAgICAgICAgIG1vZGVsLmZpbGVJZCA9IGZpbGUuaWQ7XHJcbiAgICAgICAgICAgIG1vZGVsLmlzRmlsZVZlcnNpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZVNlcnZpY2UuZ2VuZXJhdGVMaW5rRG93bmxvYWQobW9kZWwpXHJcbiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLl9maWxlU2VydmljZS5nZXRBbm9ueW1vdXNEb3dubG9hZFVybChyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRvd25sb2FkVXJsKTtcclxuICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgZG93bmxvYWQgbGluaycpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYnJvd3NlRmlsZUZyb21QZXJzb25hbCgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYnJvd3NlRmlsZUZyb21Db21wdXRlcigpIHtcclxuICAgICAgICB0aGlzLmZpbGVFbGVtZW50LmFkdmFuY2VkRmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdEZpbGVGcm9tQ29tcHV0ZXIoZXZ0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGV2dC5maWxlcyAmJiBldnQuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2dC5maWxlcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGV2dC5maWxlc1tpbmRleF0ubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5fY29tbW9uU2VydmljZS5pc0ltYWdlKGZpbGVOYW1lKSA/ICdpbWFnZScgOiAnZmlsZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudEl0ZW06IGFueSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXZ0LmZpbGVzW2luZGV4XSwgZmlsZU5hbWU6IGZpbGVOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRJdGVtLnR5cGUgPT0gJ2ltYWdlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50SXRlbS51cmwgPSBldnQuZmlsZXNbaW5kZXhdLm9iamVjdFVSTC5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmF0dGFjaG1lbnRzLnB1c2goYXR0YWNobWVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBvbiBwcm9jZXNzIHNlbGVjdCBmaWxlIGNvbXB1dGVyJywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB0aGlzLmZpbGVFbGVtZW50LmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQXR0YWNobWVudChpdGVtKSB7XHJcbiAgICAgICAgY29uc3QgaW5kID0gdGhpcy5tb2RlbC5hdHRhY2htZW50cy5maW5kSW5kZXgoeCA9PiB4LnVybCA9PT0gaXRlbS51cmwpO1xyXG4gICAgICAgIHRoaXMubW9kZWwuYXR0YWNobWVudHMuc3BsaWNlKGluZCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzQXR0YWNobWVudChpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uYXR0YWNobWVudHMgJiYgaXRlbS5hdHRhY2htZW50cy5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRJbWcoZXZ0LCBwYXJlbnRJbmRleDogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5pbWdbYCR7cGFyZW50SW5kZXh9JHtpbmRleH1gXSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5pbWdbYCR7cGFyZW50SW5kZXh9d2lkdGgke2luZGV4fWBdID0gKGV2dC50YXJnZXQud2lkdGggKyAzMikgKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIGluVGhlU2FtZVRpbWUoaTogbnVtYmVyLCBpdGVtOiBhbnksIGRhdGFTb3VyY2U6IGFueSkge1xyXG4gICAgICAgIGlmIChpIDwgZGF0YVNvdXJjZS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGQxID0gbmV3IERhdGUoZGF0YVNvdXJjZVtpICsgMV0uY3JlYXRlZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGQyID0gbmV3IERhdGUoaXRlbS5jcmVhdGVkKTtcclxuICAgICAgICAgICAgY29uc3QgbXMgPSBkMS5nZXRUaW1lKCkgLSBkMi5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBtcyA8IDMwMDAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcGluTWVzc2FnZShpdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwucGlubmVkTWVzc2FnZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlLmlkICE9IGl0ZW0uaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93Q29uZmlybSgnQuG6oW4gY8OzIGNo4bqvYyBjaOG6r24gbXXhu5FuIGdoaW0gdGluIG5o4bqvbiBuw6B5PyBUaW4gbmjhuq9uIMSRw6MgZ2hpbSB0csaw4bubYyDEkcOzIHPhur0gxJHGsOG7o2MgYuG7jyBnaGltLicpLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcnMpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUGluKGl0ZW0sIGl0ZW0uaWQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvUGluKGl0ZW0sIGl0ZW0uaWQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kb1BpbihpdGVtLCBpdGVtLmlkLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZG9QaW4oaXRlbSwgaWQsIHBpbm5lZCkge1xyXG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLnB1c2goY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJvYXJkU2VydmljZS5waW5NZXNzYWdlKGlkLCBwaW5uZWQsIGNvcnJlbGF0aW9uSWQpLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICBpZiAocGlubmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBpbm5lZE1lc3NhZ2UgPSBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRVc2VyQXZhdGFyKGF2YXRhcjogYW55KSB7XHJcbiAgICAgICAgaWYgKGF2YXRhciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmZpbGVBcGl9L2ZpbGUvcHVibGljLyR7YXZhdGFyfS9Eb3dubG9hZGA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QXZhdGFyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRQZW9wbGUoKSB7XHJcbiAgICAgICAgdGhpcy51c2VyUGlja2VyRm9ybS5zZWxlY3RlZFZhbHVlID0gdGhpcy5wZW9wbGVSZWxhdGVkVXNlcnM7XHJcbiAgICAgICAgdGhpcy51c2VyUGlja2VyRm9ybS5tdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XHJcbiAgICAgICAgdGhpcy51c2VyUGlja2VyRm9ybS5zaG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBxdWlja05vdGUoaXRlbTogYW55KSB7XHJcbiAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IHRoaXMuX3VzZXJTZXJ2aWNlLmdldEJhc2ljVXNlckluZm8oaXRlbS5jcmVhdGVkQnkpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5kYXRhLm5vdGVEYXRhTW9kZWwgPSA8YW55PntcclxuICAgICAgICAgICAgZWRpdEZvcm1Nb2RlbDogPGFueT57XHJcbiAgICAgICAgICAgICAgICBzaG93RWRpdEZvcm06IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaG93UXVpY2tOb3RlRm9ybTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHBvcHVwU2l6ZTogPGFueT57fSxcclxuICAgICAgICAgICAgICAgIGRhdGE6IDxhbnk+e1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0uY29udGVudDEsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogJzxiPicgKyB1c2VyUmVzdWx0LmZ1bGxOYW1lICsgJzwvYj4nICsgJyDEkcOjIGNoYXQgdOG6oWkgY8O0bmcgdmnhu4djICdcclxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGI+JyArIHRoaXMubW9kZWwudGFza05hbWUgKyAnPC9iPicgKyAnIHbhu5tpIG7hu5lpIGR1bmcgJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArICc8Yj4nICsgaXRlbS5jb250ZW50MSArICc8L2I+JyArICcgdsOgbyBsw7pjICcgKyBtb21lbnQobmV3IERhdGUoaXRlbS5jcmVhdGVkKSkuZm9ybWF0KCdZWVlZLU1NLUREIGhoOm1tOnNzIEEnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm1vZGVsLmVkaXRGb3JtTW9kZWwuc2hvd1F1aWNrTm90ZUZvcm0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd0FkZE5vdGVGb3JtID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vdXNlVXAoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZENsYXNzVG9NZXNzYWdlKGl0ZW06IGFueSwgaXNQaW5uZWRNZXNzYWdlOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgc3R5bGVDbGFzcyA9ICcnO1xyXG4gICAgICAgIGlmICghaXNQaW5uZWRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmlzRmlyc3RNZXNzYWdlRmxvdykge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcyA9ICdmaXJzdCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5pc0xhc3RNZXNzYWdlRmxvdykge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcyA9ICdsYXN0JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3MgPSAnbWlkZGxlJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5zZW50ID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3MgPSAnc2VuZGluZyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHlsZUNsYXNzO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkYXNoYm9hcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjaGF0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWluZm9cIj5cclxuICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6XCI+Q8OzIHt7cGVvcGxlQWxsLmxlbmd0aH19IG5nxrDhu51pIHRyb25nIG5ow7NtIG7DoHk8L2E+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGVCdXR0b25cIiBwVG9vbHRpcD1cIlhlbSB0b8OgbiBi4buZIMSRw61uaCBrw6htXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDpcIj48aSBjbGFzcz1cImZhciBmYS1pbWFnZXNcIj48L2k+PC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiYWRkUGVvcGxlKClcIiBjbGFzcz1cImNpcmNsZUJ1dHRvblwiIHBUb29sdGlwPVwiVGjDqm0gbeG7m2kgbmfGsOG7nWkgdsOgbyBuaMOzbVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZD1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OlwiPjxpIGNsYXNzPVwiZmFzIGZhLXVzZXItcGx1c1wiPjwvaT48L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDx1bCAjc2Nyb2xsTWUgW25nQ2xhc3NdPVwieydoYXNQaW4nOiBtb2RlbC5waW5uZWRNZXNzYWdlICE9IG51bGx9XCI+XHJcbiAgICAgICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLnBpbm5lZE1lc3NhZ2VcIiBjbGFzcz1cImNsZWFyZml4IHBpblwiIFtuZ0NsYXNzXT1cInsnbWVzc2FnZS1mcm9tJzogdHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIm1lc3NhZ2VJdGVtOyBjb250ZXh0OiB7IGkgOiAtMSwgaXRlbTogbW9kZWwucGlubmVkTWVzc2FnZSwgaXNQaW5uZWRNZXNzYWdlOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtb2RlbC5kYXRhU291cmNlOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5RnVuY1wiIGNsYXNzPVwiY2xlYXJmaXhcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnbWVzc2FnZS1vd24nOiBpdGVtLnR5cGUgPT0gJ293bid9XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWVzc2FnZUl0ZW07IGNvbnRleHQ6IHsgaSA6IGksIGl0ZW06IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICAgIDwhLS0gICAgICAgIDxjaGF0LXNlbmQtbWVzc2FnZS1ib3ggKm5nSWY9XCJzaG93U2VuZE1lc3NhZ2VCb3hcIj48L2NoYXQtc2VuZC1tZXNzYWdlLWJveD4tLT5cclxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsndmlzaWJsZTInOiBtb2RlbC5zY3JvbGxpbmcsICdoaWRkZW4yJzogIW1vZGVsLnNjcm9sbGluZ31cIiBjbGFzcz1cInNjcm9sbC10by1ib3R0b21cIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2RlbC5uZXdNZXNzYWdlTm90VXBkYXRlZENvdW50ID4gMFwiIChjbGljayk9XCJzY3JvbGxUb0JvdHRvbSgzNTAsIHRydWUsIG51bGwpXCI+XHJcbiAgICAgICAgICAgICAgICB7e21vZGVsLm5ld01lc3NhZ2VOb3RVcGRhdGVkQ291bnQgPD0gNSA/IG1vZGVsLm5ld01lc3NhZ2VOb3RVcGRhdGVkQ291bnQgOiAnNSsnIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwic2Nyb2xsVG9Cb3R0b20oMzUwLCB0cnVlLCBudWxsKVwiICpuZ0lmPVwibW9kZWwubmV3TWVzc2FnZU5vdFVwZGF0ZWRDb3VudCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93blwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZmlsZS12aWV3ZXIgKm5nSWY9XCJmaWxlVmlld2VyTW9kZWwuc2hvd0VkaXRGb3JtXCIgW3BhcmVudENvbnRleHRdPVwiY29udGV4dFwiIFtwYXJlbnRNb2RlbF09XCJtb2RlbFwiXHJcbiAgICBbbW9kZWxdPVwiZmlsZVZpZXdlck1vZGVsXCI+XHJcbjwvZmlsZS12aWV3ZXI+XHJcblxyXG48bmctdGVtcGxhdGUgI21lc3NhZ2VJdGVtIGxldC1pPVwiaVwiIGxldC1pc1Bpbm5lZE1lc3NhZ2U9XCJpc1Bpbm5lZE1lc3NhZ2VcIiBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgIDxpbWcgKm5nSWY9XCJpdGVtLmlzRmlyc3RNZXNzYWdlRmxvdyAmJiBpdGVtLnR5cGUgIT0gJ293bicgJiYgIWlzUGlubmVkTWVzc2FnZSAmJiBpdGVtLmF2YXRhciAhPSBudWxsXCIgYWx0PVwiXCJcclxuICAgICAgICBjbGFzcz1cImNoYXQtYXZhdGFyXCIgc3JjPVwie3tnZXRDdXJyZW50VXNlckF2YXRhcihpdGVtLmF2YXRhcil9fVwiPlxyXG4gICAgPHAgKm5nSWY9XCIoaXRlbS5pc0ZpcnN0TWVzc2FnZUZsb3cgJiYgaXRlbS50eXBlICE9ICdvd24nKSAmJiAhaXNQaW5uZWRNZXNzYWdlXCIgY2xhc3M9XCJtZXNzYWdlLWNyZWF0ZWQtYnlcIj5cclxuICAgICAgICB7e2l0ZW0uZnVsbE5hbWV9fVxyXG4gICAgPC9wPlxyXG4gICAgPHNwYW4gKm5nSWY9XCIhaGFzQXR0YWNobWVudChpdGVtKVwiPlxyXG4gICAgICAgIDwhLS0gICAgICAgICAgW2NsYXNzXT1cImFkZENsYXNzVG9NZXNzYWdlKGl0ZW0sIGlzUGlubmVkTWVzc2FnZSlcIj4tLT5cclxuICAgICAgICA8cCAqbmdJZj1cIiFoYXNBdHRhY2htZW50KGl0ZW0pXCIgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGkgKGNsaWNrKT1cInBpbk1lc3NhZ2UoaXRlbSlcIiBjbGFzcz1cImZhcyBmYS10aHVtYnRhY2tcIiBzdHlsZT1cInJpZ2h0OiAwO1wiPjwvaT5cclxuICAgICAgICAgICAgPGkgKGNsaWNrKT1cInF1aWNrTm90ZShpdGVtKVwiIGNsYXNzPVwiZmFzIGZhLXN0aWNreS1ub3RlXCI+PC9pPlxyXG4gICAgICAgICAgICB7e2l0ZW0uY29udGVudH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxwICpuZ0lmPVwiIWlzUGlubmVkTWVzc2FnZSAmJiAoaXRlbS5pc0xhc3RNZXNzYWdlRmxvdyB8fCAhaW5UaGVTYW1lVGltZShpLCBpdGVtLCBtb2RlbC5kYXRhU291cmNlKSlcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm1lc3NhZ2UtY3JlYXRlZFwiIHBUb29sdGlwPVwie3tpdGVtLmNyZWF0ZWQgfCBkYXRlOidkZC9NTS95eXl5IEhIOm1tJ319XCJcclxuICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwie3tpdGVtLnR5cGUgIT0gJ293bic/J3JpZ2h0JzonbGVmdCd9fVwiPlxyXG4gICAgICAgICAgICB7e19jcnVkU2VydmljZS5yZW5kZXJEYXRlVGltZShpdGVtLmNyZWF0ZWQpfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHAgKm5nSWY9XCJpc1Bpbm5lZE1lc3NhZ2VcIiBjbGFzcz1cIm1lc3NhZ2UtY3JlYXRlZFwiPlxyXG4gICAgICAgICAgICB7e2l0ZW0uY3JlYXRlZEJ5fX0gxJHDoyBn4butaSBsw7pjIHt7aXRlbS5jcmVhdGVkIHwgZGF0ZTonZGQvTU0veXl5eSBISDptbSd9fVxyXG4gICAgICAgIDwvcD5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNBdHRhY2htZW50KGl0ZW0pXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYXR0YWNobWVudEl0ZW0gb2YgaXRlbS5hdHRhY2htZW50cztsZXQgaW5kZXg9aW5kZXhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmaXJzdCc6aXRlbS5pc0ZpcnN0TWVzc2FnZUZsb3cgJiYgaW5kZXggPT0gMCwgJ21pZGRsZSc6aW5kZXggPiAwIHx8ICFpdGVtLmlzRmlyc3RNZXNzYWdlRmxvdywgJ2ltYWdlJyA6IGF0dGFjaG1lbnRJdGVtLnR5cGUgPT0gJ2ltYWdlJ31cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IG1vZGVsLmltZ1tpICsgJ3dpZHRoJyArIGluZGV4XX1cIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXR0YWNobWVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIChtb3VzZXVwKT1cIm9uTW91c2VVcCgkZXZlbnQpXCIgY2xhc3M9XCJhdHRhY2htZW50LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJhdHRhY2htZW50SXRlbS50eXBlICE9ICdpbWFnZSdcIiAoY2xpY2spPVwidmlld09yRG93bmxvYWRGaWxlKCRldmVudCwgYXR0YWNobWVudEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wYXBlcmNsaXBcIj48L2k+e3thdHRhY2htZW50SXRlbS5maWxlTmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJhdHRhY2htZW50SXRlbS50eXBlID09ICdpbWFnZSdcIiAjYUVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGlkZGVuJzogIW1vZGVsLmltZ1tpICsgJycgKyBpbmRleF0sICd2aXNpYmxlJzptb2RlbC5pbWdbaSArICcnICsgaW5kZXhdfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld09yRG93bmxvYWRGaWxlKCRldmVudCwgYXR0YWNobWVudEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwibWVzc2FnZS1pbWdcIiAobG9hZCk9XCJsb2FkSW1nKCRldmVudCwgaSwgaW5kZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImF0dGFjaG1lbnRJdGVtLnVybCB8IHNlY3VyZSB8IGFzeW5jXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjbGVhcjogYm90aFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtZXNzYWdlLWNyZWF0ZWRcIiBwVG9vbHRpcD1cInt7aXRlbS5jcmVhdGVkIHwgZGF0ZTonZGQvTU0veXl5eSBISDptbSd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwie3tpdGVtLnR5cGUgIT0gJ293bic/J3JpZ2h0JzonbGVmdCd9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7X2NydWRTZXJ2aWNlLnJlbmRlckRhdGVUaW1lKGl0ZW0uY3JlYXRlZCl9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNsZWFyOiBib3RoXCI+PC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxhZnRlci12aWV3LWNoZWNrZWQgKm5nSWY9XCJtb2RlbC5kYXRhU291cmNlLmxlbmd0aCA9PSBpICsgMVwiIChsb2FkaW5nKT1cInNjcm9sbFRvQm90dG9tKDAsIGZhbHNlLCBpdGVtLnNlbnQpXCI+XHJcbiAgICA8L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS08dG4tZGlhbG9nICpuZ0lmPVwidXNlclBpY2tlckZvcm0uc2hvd1wiICNkaWFsb2cgW3N0eWxlQ2xhc3NdPVwiJ3RuLWZvcm0tZGlhbG9nJ1wiLS0+XHJcbjwhLS0gICAgICAgICAgIFtoZWFkZXJdPVwiJ1Row6ptIG3hu5tpIG5nxrDhu51pIGTDuW5nJyB8IHRyYW5zbGF0ZVwiIFtwb3B1cFNpemVdPVwidXNlclBpY2tlckZvcm0ucG9wdXBTaXplXCItLT5cclxuPCEtLSAgICAgICAgICAgKG9uQ2FuY2VsKT1cInVzZXJQaWNrZXJGb3JtLnNob3cgPSBmYWxzZVwiLS0+XHJcbjwhLS0gICAgICAgICAgIChvbkhpZGUpPVwidXNlclBpY2tlckZvcm0uc2hvdyA9IGZhbHNlXCI+LS0+XHJcbjwhLS0gICAgJmx0OyEmbmRhc2g7ICAgIDxjb25ndmllYy1mb3JtICNmb3JtQmFzZSBbcGFyZW50TW9kZWxdPVwibW9kZWxcIiBbcGFyZW50Q29udGV4dF09XCJjb250ZXh0XCIgW21vZGVsXT1cImZvcm1Nb2RlbFwiJm5kYXNoOyZndDstLT5cclxuPCEtLSAgICAmbHQ7ISZuZGFzaDsgICAgICAgICAgICAgICAgICAgKG9uU2F2ZWQpPVwic2hvd0RldGFpbEZvcm0gPSBmYWxzZTtjcnVkTGlzdC5yZWxvYWQoKVwiIChvbkNhbmNlbCk9XCJfaGFuZGxlQ2FuY2VsKCRldmVudClcIiZuZGFzaDsmZ3Q7LS0+XHJcbjwhLS0gICAgJmx0OyEmbmRhc2g7ICAgICAgICAgICAgICAgICAgIChvbkFmdGVyU2F2ZWQpPVwib25BZnRlclNhdmVkKCRldmVudClcIj48L2Nvbmd2aWVjLWZvcm0+Jm5kYXNoOyZndDstLT5cclxuPCEtLSAgICA8dXNlci1waWNrZXItYm94ICNmb3JtQmFzZSBbY29udHJvbF09XCJ1c2VyUGlja2VyQ29udHJvbFwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRoaXMucGVvcGxlQWxsXCIgW211bHRpcGxlXT1cInVzZXJQaWNrZXJDb250cm9sLm11bHRpcGxlXCI+LS0+XHJcbjwhLS0gICAgPC91c2VyLXBpY2tlci1ib3g+LS0+XHJcbjwhLS08L3RuLWRpYWxvZz4tLT5cclxuXHJcblxyXG48IS0tPHRuLWRpYWxvZyAqbmdJZj1cInVzZXJQaWNrZXJGb3JtLnNob3dcIiAjZGlhbG9nIFtzdHlsZUNsYXNzXT1cIid0bi1mb3JtLWRpYWxvZydcIi0tPlxyXG48IS0tICAgICAgICAgICBbaGVhZGVyXT1cIidUaMOqbSBt4bubaSBuZ8aw4budaSBkw7luZycgfCB0cmFuc2xhdGVcIiBbcG9wdXBTaXplXT1cInVzZXJQaWNrZXJGb3JtLnBvcHVwU2l6ZVwiIChvbkhpZGUpPVwidXNlclBpY2tlckZvcm0uc2hvdyA9PSBmYWxzZVwiPi0tPlxyXG48IS0tICAgICZsdDshJm5kYXNoOyAgICA8Y29uZ3ZpZWMtZm9ybSAjZm9ybUJhc2UgW3BhcmVudE1vZGVsXT1cIm1vZGVsXCIgW3BhcmVudENvbnRleHRdPVwiY29udGV4dFwiIFttb2RlbF09XCJmb3JtTW9kZWxcIiZuZGFzaDsmZ3Q7LS0+XHJcbjwhLS0gICAgJmx0OyEmbmRhc2g7ICAgICAgICAgICAgICAgICAgIChvblNhdmVkKT1cInNob3dEZXRhaWxGb3JtID0gZmFsc2U7Y3J1ZExpc3QucmVsb2FkKClcIiAob25DYW5jZWwpPVwiX2hhbmRsZUNhbmNlbCgkZXZlbnQpXCImbmRhc2g7Jmd0Oy0tPlxyXG48IS0tICAgICZsdDshJm5kYXNoOyAgICAgICAgICAgICAgICAgICAob25BZnRlclNhdmVkKT1cIm9uQWZ0ZXJTYXZlZCgkZXZlbnQpXCI+PC9jb25ndmllYy1mb3JtPiZuZGFzaDsmZ3Q7LS0+XHJcblxyXG48IS0tICAgICZsdDshJm5kYXNoOzxxdWljay1hZGQtZm9ybSAqbmdJZj1cIm1vZGVsLmVkaXRGb3JtTW9kZWwuc2hvd1F1aWNrTm90ZUZvcm1cIiBbcGFyZW50Q29udGV4dF09XCJjb250ZXh0XCImbmRhc2g7Jmd0Oy0tPlxyXG48IS0tICAgICZsdDshJm5kYXNoOyAgICAgICAgICAgICAgICBbcGFyZW50TW9kZWxdPVwiY29udGV4dC5kYXRhLm5vdGVEYXRhTW9kZWxcIj48L3F1aWNrLWFkZC1mb3JtPiZuZGFzaDsmZ3Q7LS0+XHJcbjwhLS08L3RuLWRpYWxvZz4tLT4iXX0=