@posiwise/smart-crm 0.0.50 → 0.0.53

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 (22) hide show
  1. package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.mjs +2 -2
  2. package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.mjs +44 -13
  3. package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.mjs +9 -5
  4. package/esm2022/lib/private/components/smart-crm-insight/smart-crm-account-insight/smart-crm-account-insight.component.mjs +121 -33
  5. package/esm2022/lib/private/components/smart-crm-insight/smart-crm-analysis-insight/smart-crm-analysis.component.mjs +5 -3
  6. package/esm2022/lib/private/components/smart-crm-insight/smart-crm-contact-insight/smart-crm-contact-insight.component.mjs +11 -6
  7. package/esm2022/lib/private/components/smart-crm-insight/smart-crm-marketing-insight/smart-crm-marketing-insight.component.mjs +5 -3
  8. package/esm2022/lib/private/components/smart-crm-insight/smart-crm-opportunities-insight/smart-crm-opportunities-insight.component.mjs +15 -8
  9. package/esm2022/lib/private/components/smart-crm-leads/smart-crm-leads-details/smart-crm-leads-details.component.mjs +6 -5
  10. package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.mjs +5 -3
  11. package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.mjs +45 -8
  12. package/esm2022/lib/public/components/smart-crm-signup/smart-crm-signup.component.mjs +1 -1
  13. package/esm2022/lib/shared/interface/crm-account.interface.mjs +1 -1
  14. package/esm2022/lib/shared/interface/crm-opportunity.interface.mjs +1 -1
  15. package/fesm2022/posiwise-smart-crm.mjs +285 -107
  16. package/fesm2022/posiwise-smart-crm.mjs.map +1 -1
  17. package/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.d.ts +6 -0
  18. package/lib/private/components/smart-crm-insight/smart-crm-account-insight/smart-crm-account-insight.component.d.ts +29 -7
  19. package/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.d.ts +4 -0
  20. package/lib/shared/interface/crm-account.interface.d.ts +6 -0
  21. package/lib/shared/interface/crm-opportunity.interface.d.ts +7 -0
  22. package/package.json +1 -1
@@ -220,11 +220,14 @@ export class SmartCrmContactComponent extends AppBaseComponent {
220
220
  this.crmService
221
221
  .getCrmAnalytics(this.subscription?.id, 'contacts_insights')
222
222
  .subscribe(response => {
223
- if (typeof response === 'object' && Object.keys(response).length === 0) {
223
+ // API now returns { items: [], totals: {} } instead of array
224
+ const items = response?.items || response;
225
+ if (typeof items === 'object' && Object.keys(items).length === 0) {
224
226
  this.contactInsight = [];
225
227
  }
226
- else
227
- this.contactInsight = response;
228
+ else {
229
+ this.contactInsight = Array.isArray(items) ? items : [];
230
+ }
228
231
  });
229
232
  }
230
233
  /** Function to call contact geography */
@@ -232,7 +235,8 @@ export class SmartCrmContactComponent extends AppBaseComponent {
232
235
  this.crmService
233
236
  .getCrmAnalytics(this.subscription?.id, 'contacts_geography')
234
237
  .subscribe(response => {
235
- this.contactGeography = response;
238
+ // API now returns { items: [], totals: {} } instead of array/object
239
+ this.contactGeography = response?.items || response;
236
240
  });
237
241
  }
238
242
  navigateToOpportunities() {
@@ -294,4 +298,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
294
298
  type: Component,
295
299
  args: [{ selector: 'pw-crm-contacts', template: "<div class=\"row\">\n <div class=\"col-12 mb-3\">\n <h2 *ngIf=\"!accountData?.name\">Contacts</h2>\n <h3 *ngIf=\"accountData?.name\"\n class=\"mb-2\">\n {{ accountData.name }}\n <span *ngIf=\"hasAccess || accountData.owner_id === userId\" [routerLink]=\"['/' + subscription?.slug + routers.accounts, accountData.id]\"><i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i></span>\n </h3>\n <h4 *ngIf=\"accountData?.location\"\n class=\"mb-1\">Location: {{ accountData.location }}</h4>\n <h4 *ngIf=\"accountData?.tel\">Tel: {{ accountData.tel }}</h4>\n <h4 *ngIf=\"accountData?.company_url\">\n URL:\n <a href=\"{{ accountData.company_url }}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n {{ accountData.company_url }}\n </a>\n </h4>\n <a class=\"btn btn-sm btn-outline-primary float-end mb-3 ms-2\"\n data-cy=\"add-opportunities\"\n (click)=\"navigateToOpportunities()\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n data-cy=\"add-contact\"\n [routerLink]=\"['/' + subscription?.slug + routers.contactAdd, accountId]\"\n *ngIf=\"accountData?.name\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.AddContact' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n data-cy=\"add-contact\"\n [routerLink]=\"['/' + subscription?.slug + routers.contactAdd]\"\n *ngIf=\"!accountData?.name\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.AddContact' | transloco }}\n </a>\n <a class=\"btn btn-sm btn-outline-primary me-3 float-end\"\n data-cy=\"list-contact\"\n [routerLink]=\"['/' + subscription?.slug + routers.contacts]\"\n *ngIf=\"accountData?.name\">\n <i class=\"fa fa-plus-list\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.ShowAllContacts' | transloco }}\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n</div>\n<div class=\"primeng-datatable-container table-responsive\"\n [class.hideTable]=\"data.unfiltered_count === 0\">\n <p-table class=\"table\"\n #dt\n [value]=\"data.contacts\"\n [paginator]=\"data.object_count !== 0\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"data.object_count\"\n [loading]=\"loading\"\n [lazy]=\"true\"\n [filterDelay]=\"1000\"\n stateStorage=\"local\"\n stateKey=\"smart-crm-contacts\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"row\">\n <div class=\"col-sm-3 col-6 mb-sm-0 mb-0\">\n <p-dropdown\n [options]=\"potential\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"filterByPotentials\"\n [placeholder]=\"'Select Priority'\"\n (onChange)=\"filterByPotential($event.value)\">\n </p-dropdown>\n </div>\n <div class=\"col-sm-3 col-6\">\n <p-multiSelect [(ngModel)]=\"selectedLabels\" placeholder=\"Select Label\" [options]=\"labels\" [filter]=\"true\"\n [showHeader]=\"true\" [showToggleAll]=\"true\" (onChange)=\"onLabelChange($event)\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <!-- multiple select account drop down -->\n <div class=\"col-sm-3 col-6\">\n <p-multiSelect [(ngModel)]=\"selectedAccount\" placeholder=\"Select Account\" [options]=\"accountDropDown\" [filter]=\"true\"\n [showHeader]=\"true\" [showToggleAll]=\"true\" optionLabel=\"name\" (onChange)=\"onSelectAccount()\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-sm-3 col-md-4 col-lg-3\">\n <div class=\"d-flex\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\" [(ngModel)]=\"searchText\" pInputText placeholder=\"Search contact...\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" class=\"form-control\" />\n </div>\n </div>\n\n </div>\n\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Crm.ContactMessage.Name' | transloco }}\n <p-sortIcon field=\"first_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"owner_id\">\n {{ 'Crm.ContactMessage.ContactOwner' | transloco }}\n <p-sortIcon field=\"owner_id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"crm_account_id\">\n {{ 'Crm.ContactMessage.AccountOwner' | transloco }}\n <p-sortIcon field=\"crm_account_id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"labels\">\n {{ 'Crm.ContactMessage.Labels' | transloco }}\n <p-sortIcon field=\"labels\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"potential\">\n {{ 'Crm.ContactMessage.Potential' | transloco }}\n <p-sortIcon field=\"potential\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-contact>\n <tr>\n <td data-head=\"Name\"\n class=\"contactname\">\n <a ngbTooltip=\"{{contact.headline ? contact.headline : 'No headline for this contact'}}\"\n [routerLink]=\"['/' + subscription?.slug + routers.contactInfo, contact.id]\">{{ (contact?.first_name || '') + ' ' + (contact?.last_name || '') | textTruncate: 20 }}\n </a>\n </td>\n <td data-head=\"OwnerName\">{{ contact.owner | ifNameNullShowEmail }}</td>\n <td data-head=\"Account Name\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n contact.crm_account.id\n ]\" ngbTooltip=\"{{contact?.crm_account.name}}\">{{ contact?.crm_account.name | textTruncate: 20 }}</a>\n </td>\n <td data-head=\"Labels\">\n <span class=\"badge bg-info m-1\"\n *ngFor=\"let item of contact.labels\">{{\n item\n }}</span>\n </td>\n <td data-head=\"Potential\">\n <span [appDynamicBadge]=\"{ itemsArray: potential, item: contact.potential }\"\n color=\"warning\"\n class=\"badge\">{{ contact.potential }}</span>\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Show\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[\n '/' + subscription?.slug + '/crm/contacts/info',\n contact.id\n ]\">\n <i class=\"fa fa-eye see-icon\" aria-hidden=\"true\"></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Add opportunity\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\"\n [queryParams]=\"{ contact_id: contact.id }\">\n <i class=\"fa fa-plus-circle add-icon\" aria-hidden=\"true\"></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Edit\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactDetails,\n contact.id\n ]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Delete\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(contact.id)\"\n (keydown.space)=\"onDelete(contact.id)\"\n (click)=\"onDelete(contact.id)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"data.object_count === 0 && data.unfiltered_count !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage'| transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n</div>\n <span class=\"total-records-count\" *ngIf=\"data.object_count !== 0\">{{ 'Label.Total' | transloco }}: {{ data.object_count }}</span>\n</div>\n<div *ngIf=\"data.unfiltered_count === 0 && isLoaded\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.ContactMessage.ContactsAdminMessage' | transloco\"> </pw-no-data>\n</div>\n\n<ng-container>\n <div class=\"row mt-5\"\n *ngIf=\"isLoaded && !accountData?.name\">\n <!-- Drill Down -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Watch Closely</h5>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"contactInsight?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"contactInsight\"\n [paginator]=\"contactInsight?.length !== 0\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"contactInsight.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Contact' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.ContactMessage.Reason' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-insight>\n <tr>\n <td data-head=\"Contact\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.contactInfo, insight.crm_contact_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"insight?.name\">{{ insight?.name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"Headline\">\n <span\n [ngbTooltip]=\"insight?.headline\"\n container=\"body\"\n tooltipClass=\"custom-tooltip\"\n placement=\"bottom\"\n >\n {{ insight?.headline | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"Reason\">\n {{ insight.reason }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"contactInsight?.length !== 0\">Total: {{ contactInsight.length }}</span>\n </div>\n <div *ngIf=\"!contactInsight?.length\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.ContactMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n <!-- Geography -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contacts Location</h5>\n <div>\n <ng-template [ngIf]=\"contactGeography\">\n <plotly-plot [data]=\"contactGeography?.data\"\n [config]=\"contactGeography?.config\"\n [layout]=\"contactGeography?.layout\" [useResizeHandler]=\"contactGeography ? true : false\">\n </plotly-plot>\n </ng-template>\n </div>\n <div *ngIf=\"!contactGeography\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.ContactMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.table tr{vertical-align:baseline}@media (min-width: 640px){.list-inline{width:150px}}@media (min-width: 640px) and (max-width: 768px){.primeng-datatable-container tr td{width:350px}}\n"] }]
296
300
  }], ctorParameters: () => [{ type: i1.CrmService }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }] });
297
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLWNvbnRhY3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc21hcnQtY3JtL3NyYy9saWIvcHJpdmF0ZS9jb21wb25lbnRzL3NtYXJ0LWNybS1jb250YWN0cy9zbWFydC1jcm0tY29udGFjdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLWNvbnRhY3RzL3NtYXJ0LWNybS1jb250YWN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBR1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQXNDLE1BQU0sNEJBQTRCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUszQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU8xRCxNQUFNLE9BQU8sd0JBQ1QsU0FBUSxnQkFBZ0I7SUF3Q3hCLFlBQ3FCLFVBQXNCLEVBQ3ZDLFFBQWtCLEVBQ0QsR0FBc0I7UUFFdkMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSkMsZUFBVSxHQUFWLFVBQVUsQ0FB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QyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDbEQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7K0dBOVRRLHdCQUF3QjttR0FBeEIsd0JBQXdCLDhFQzdCckMsNGlaQXFTQTs7NEZEeFFhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDSSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0NoZWNrZWQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEluamVjdG9yLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQXBwQmFzZUNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS9hcHAtYmFzZS1jb21wb25lbnQnO1xuaW1wb3J0IHsgUEFHRV9TSVpFLCBQYWdpbmcsIFBsb3RseSwgU3Vic2NyaXB0aW9uLCBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9oZWxwZXItc2VydmljZSc7XG5pbXBvcnQgeyBDcm1TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL3NtYXJ0LWNybS1zaGFyZWQnO1xuXG5pbXBvcnQgeyBMYXp5TG9hZEV2ZW50IH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDcm1BY2NvdW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tYWNjb3VudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3JtQ29udGFjdFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tY29udGFjdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT3Bwb3J0dW5pdHlJbnNpZ2h0IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9zbWFydC1jcm0tbW9kdWxlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBST1VURVJTIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3JvdXRlcnMvcm91dGVycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctY3JtLWNvbnRhY3RzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtY3JtLWNvbnRhY3RzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zbWFydC1jcm0tY29udGFjdHMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTbWFydENybUNvbnRhY3RDb21wb25lbnRcbiAgICBleHRlbmRzIEFwcEJhc2VDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkXG57XG4gICAgcHJpdmF0ZSBwYWdlID0gMTtcblxuICAgIGRhdGE6IENybUNvbnRhY3RSZXNwb25zZSA9IHtcbiAgICAgICAgY29udGFjdHM6IFtdLFxuICAgICAgICBvYmplY3RfY291bnQ6IDAsXG4gICAgICAgIHVuZmlsdGVyZWRfY291bnQ6IDBcbiAgICB9O1xuXG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgc3Vic2NyaXB0aW9uSWQ6IG51bWJlcjtcblxuICAgIGNvbnRhY3RJZDogbnVtYmVyO1xuICAgIGFjY291bnRJZDogbnVtYmVyO1xuICAgIGFjY291bnREYXRhOiBDcm1BY2NvdW50O1xuICAgIHVzZXJJZDogbnVtYmVyO1xuICAgIHVzZXI6IFVzZXI7XG5cbiAgICBjb250YWN0SW5zaWdodDogT3Bwb3J0dW5pdHlJbnNpZ2h0W107XG4gICAgY29udGFjdEdlb2dyYXBoeTogUGxvdGx5LkZpZ3VyZTtcblxuICAgIGZpbHRlckJ5UG90ZW50aWFsczogc3RyaW5nO1xuICAgIGZpbHRlckJ5U3RhdHVzOiBzdHJpbmc7XG4gICAgcG90ZW50aWFsID0gW107XG4gICAgbGFiZWxzID0gW107XG4gICAgc2VsZWN0ZWRMYWJlbHMgPSBbXTtcbiAgICBzZWxlY3RlZEFjY291bnQgPSBbXTtcbiAgICBhY2NvdW50RHJvcERvd24gPSBbXTtcbiAgICBjcm1BY2NvdW50SWRzOiBzdHJpbmc7XG5cbiAgICBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICBoYXNBY2Nlc3MgPSBmYWxzZTtcbiAgICBpc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgcm91dGVycyA9IFJPVVRFUlM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjcm1TZXJ2aWNlOiBDcm1TZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICkge1xuICAgICAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGFjdElkID0gTnVtYmVyKGRhdGFbJ2FjY291bnRJZCddKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0VXNlclN1YnNjcmlwdGlvbigpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGVmYXVsdFZhbHVlcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFibGVTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQWNjZXNzID0gdGhpcy5oYXNBZG1pbkFjY2Vzcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm8oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFjY291bnRzRHJvcGRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8qKmdldCBhY2NvdW50cyBkcm9wZG93biAqL1xuICAgIHB1YmxpYyBnZXRBY2NvdW50c0Ryb3Bkb3duKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2UuZ2V0QWxsQWNjb3VudHMoeyBzdWJzY3JpcHRpb25faWQ6IHRoaXMuc3Vic2NyaXB0aW9uPy5pZCB9KS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY291bnREcm9wRG93biA9IHJlcz8uYWNjb3VudHMubWFwKHggPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHg/LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogeD8ubmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqc2VsZWN0IG9wdGlvbiBmcm9tIGFjY291bnQgZHJvcGRvd24gKi9cbiAgICBvblNlbGVjdEFjY291bnQoKSB7XG4gICAgICAgIHRoaXMuY3JtQWNjb3VudElkcyA9IHRoaXMuc2VsZWN0ZWRBY2NvdW50Lm1hcCh5ID0+IHkuaWQpLmpvaW4oKTtcbiAgICAgICAgdGhpcy5nZXRBbGxDb250YWN0cyh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRUYWJsZVN0YXRlKCkge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPVxuICAgICAgICAgICAgSlNPTi5wYXJzZSh0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzbWFydC1jcm0tY29udGFjdHMnKSk/LmZpbHRlcnM/Lmdsb2JhbC52YWx1ZSA/P1xuICAgICAgICAgICAgJyc7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHRoaXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NybUNvbnRhY3RzU3RhdGUnKSk7XG4gICAgICAgIHRoaXMuZmlsdGVyQnlTdGF0dXMgPSBkYXRhPy5sYWJlbDtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVBvdGVudGlhbHMgPSBkYXRhPy5wb3RlbnRpYWw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbHMgPSBkYXRhPy5sYWJlbCA/IGRhdGE/LmxhYmVsLnNwbGl0KCcsJykgOiBbXTtcbiAgICB9XG5cbiAgICBvbkxhenlMb2FkKGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhZ2VEZXRhaWxzID0gSGVscGVyU2VydmljZS5vblRhYmxlTGF6eUxvYWQoZXZlbnQpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlRGV0YWlscy5wYWdlO1xuICAgICAgICB0aGlzLmdldERhdGEoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICBvcmRlcl9ieTogcGFnZURldGFpbHMuc29ydEZpZWxkLFxuICAgICAgICAgICAgb3JkZXJfZGlyZWN0aW9uOiBwYWdlRGV0YWlscy5zb3J0T3JkZXIsXG4gICAgICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVGV4dFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERhdGEocGFnaW5nOiBQYWdpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFjdElkID4gMCkge1xuICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50Q29udGFjdHMocGFnaW5nKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudERldGFpbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZXRBbGxDb250YWN0cyhwYWdpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGdldCB1c2VyIGRldGFpbHMgKi9cbiAgICBwcml2YXRlIGdldFVzZXJJbmZvKCkge1xuICAgICAgICB0aGlzLnVzZXJTdG9yZSgpLnN1YnNjcmliZSh1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXIuaWQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblNlcnZpY2UuaXNHcmFudGVkKCdQYWdlcy5CZXRhJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250YWN0SW5zaWdodCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRhY3RHZW9ncmFwaHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYWxsIGNvbnRhY3RzICovXG4gICAgcHJpdmF0ZSBnZXRBbGxDb250YWN0cyhwYWdpbmc6IFBhZ2luZykge1xuICAgICAgICB0aGlzLmdldFVzZXJTdWJzY3JpcHRpb25JZCgpLnN1YnNjcmliZShpZCA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0QWxsQ29udGFjdHMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJCeVBvdGVudGlhbHMgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckJ5U3RhdHVzIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcm1BY2NvdW50SWRzIHx8ICcnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGdldCB0aGUgY29udGFjdHMgcmVsYXRlZCB0byBhY2NvdW50cyAqL1xuICAgIHByaXZhdGUgZ2V0QWNjb3VudENvbnRhY3RzKHBhZ2luZzogUGFnaW5nKSB7XG4gICAgICAgIHRoaXMuZGF0YS5jb250YWN0cyA9IFtdO1xuICAgICAgICB0aGlzLmdldFVzZXJTdWJzY3JpcHRpb25JZCgpLnN1YnNjcmliZShpZCA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0QWNjb3VudENvbnRhY3RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJCeVBvdGVudGlhbHMgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckJ5U3RhdHVzIHx8ICcnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGdldCB0aGUgYWNjb3VudCBuYW1lICovXG4gICAgcHJpdmF0ZSBnZXRBY2NvdW50RGV0YWlsKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRBY2NvdW50RGV0YWlsKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgdGhpcy5jb250YWN0SWQpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY291bnREYXRhID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50SWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBkZWxldGUgY29udGFjdCAqL1xuICAgIG9uRGVsZXRlKGlkOiBudW1iZXIpIHtcbiAgICAgICAgSGVscGVyU2VydmljZS5yYWlzZURlbGV0ZVBvcHVwKCkudGhlbihyZXNwID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlLmRlbGV0ZUNvbnRhY3QodGhpcy5zdWJzY3JpcHRpb24/LmlkLCBpZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5Db250YWN0TWVzc2FnZS5EZWxldGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jb250YWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250YWN0SWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFjY291bnRDb250YWN0cyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jb250YWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxDb250YWN0cyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZmlsdGVyIGJ5IHBvdGVudGlhbCAqL1xuICAgIGZpbHRlckJ5UG90ZW50aWFsKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQnlQb3RlbnRpYWxzID0gZXZlbnQ7XG4gICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0kKFxuICAgICAgICAgICAgJ2NybUNvbnRhY3RzU3RhdGUnLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBsYWJlbDogdGhpcy5maWx0ZXJCeVN0YXR1cywgcG90ZW50aWFsOiB0aGlzLmZpbHRlckJ5UG90ZW50aWFscyB9KVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jb250YWN0SWQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmdldEFjY291bnRDb250YWN0cyh7XG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudERldGFpbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZXRBbGxDb250YWN0cyh7XG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIGNvbnRhY3QgaW5zaWdodCAqL1xuICAgIHByaXZhdGUgZ2V0Q29udGFjdEluc2lnaHQoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdjb250YWN0c19pbnNpZ2h0cycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEluc2lnaHQgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5jb250YWN0SW5zaWdodCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgY29udGFjdCBnZW9ncmFwaHkgKi9cbiAgICBnZXRDb250YWN0R2VvZ3JhcGh5KCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDcm1BbmFseXRpY3ModGhpcy5zdWJzY3JpcHRpb24/LmlkLCAnY29udGFjdHNfZ2VvZ3JhcGh5JylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEdlb2dyYXBoeSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmF2aWdhdGVUb09wcG9ydHVuaXRpZXMoKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgLyR7dGhpcy5zdWJzY3JpcHRpb24/LnNsdWd9JHt0aGlzLnJvdXRlcnMub3Bwb3J0dW5pdHlBZGR9YF0sIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGFjY291bnRfaWQ6IHRoaXMuYWNjb3VudElkIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFZhbHVlcyhpZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZS5nZXRDcm1Db250YWN0RGVmYXVsdFZhbHVlcyhpZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLnBvdGVudGlhbCA9IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnU2VsZWN0IFByaW9yaXR5JywgdmFsdWU6IG51bGwgfSxcbiAgICAgICAgICAgICAgICAuLi4ocmVzWydwb3RlbnRpYWwnXSA/PyBbXSkubWFwKGl0ZW0gPT4gKHsgbGFiZWw6IGl0ZW0sIHZhbHVlOiBpdGVtIH0pKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gcmVzWydsYWJlbHMnXTtcbiAgICAgICAgICAgIGxhYmVsLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdmFsLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmdldFRhYmxlU3RhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25MYWJlbENoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLmZpbHRlckJ5U3RhdHVzID0gZXZlbnQudmFsdWUuam9pbigpO1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtJChcbiAgICAgICAgICAgICdjcm1Db250YWN0c1N0YXRlJyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgbGFiZWw6IHRoaXMuZmlsdGVyQnlTdGF0dXMsIHBvdGVudGlhbDogdGhpcy5maWx0ZXJCeVBvdGVudGlhbHMgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGFjdElkID4gMCkge1xuICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50Q29udGFjdHMoe1xuICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmdldEFjY291bnREZXRhaWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWxsQ29udGFjdHMoe1xuICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgY29uc3Qgbm90aWZpZXIgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZSh0YWtlVW50aWwobm90aWZpZXIpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgIGlmICghZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMuaW5jbHVkZXMoJy9jb250YWN0cycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0kKCdzbWFydC1jcm0tY29udGFjdHMnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSQoJ2NybUNvbnRhY3RzU3RhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0zXCI+XG4gICAgPGgyICpuZ0lmPVwiIWFjY291bnREYXRhPy5uYW1lXCI+Q29udGFjdHM8L2gyPlxuICAgIDxoMyAqbmdJZj1cImFjY291bnREYXRhPy5uYW1lXCJcbiAgICAgIGNsYXNzPVwibWItMlwiPlxuICAgICAge3sgYWNjb3VudERhdGEubmFtZSB9fVxuICAgICAgPHNwYW4gKm5nSWY9XCJoYXNBY2Nlc3MgfHwgYWNjb3VudERhdGEub3duZXJfaWQgPT09IHVzZXJJZFwiIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmFjY291bnRzLCBhY2NvdW50RGF0YS5pZF1cIj48aSBjbGFzcz1cImZhIGZhLWVkaXQgZWRpdC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvc3Bhbj5cbiAgICA8L2gzPlxuICAgIDxoNCAqbmdJZj1cImFjY291bnREYXRhPy5sb2NhdGlvblwiXG4gICAgICBjbGFzcz1cIm1iLTFcIj5Mb2NhdGlvbjoge3sgYWNjb3VudERhdGEubG9jYXRpb24gfX08L2g0PlxuICAgIDxoNCAqbmdJZj1cImFjY291bnREYXRhPy50ZWxcIj5UZWw6IHt7IGFjY291bnREYXRhLnRlbCB9fTwvaDQ+XG4gICAgPGg0ICpuZ0lmPVwiYWNjb3VudERhdGE/LmNvbXBhbnlfdXJsXCI+XG4gICAgICBVUkw6XG4gICAgICA8YSBocmVmPVwie3sgYWNjb3VudERhdGEuY29tcGFueV91cmwgfX1cIlxuICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+XG4gICAgICAgIHt7IGFjY291bnREYXRhLmNvbXBhbnlfdXJsIH19XG4gICAgICA8L2E+XG4gICAgPC9oND5cbiAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmQgbWItMyBtcy0yXCJcbiAgICAgIGRhdGEtY3k9XCJhZGQtb3Bwb3J0dW5pdGllc1wiXG4gICAgICAoY2xpY2spPVwibmF2aWdhdGVUb09wcG9ydHVuaXRpZXMoKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQWRkT3Bwb3J0dW5pdHknIHwgdHJhbnNsb2NvIH19XG4gICAgPC9hPlxuICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IGZsb2F0LWVuZFwiXG4gICAgICBkYXRhLWN5PVwiYWRkLWNvbnRhY3RcIlxuICAgICAgW3JvdXRlckxpbmtdPVwiWycvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuY29udGFjdEFkZCwgYWNjb3VudElkXVwiXG4gICAgICAqbmdJZj1cImFjY291bnREYXRhPy5uYW1lXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAge3sgJ0NybS5Db250YWN0TWVzc2FnZS5BZGRDb250YWN0JyB8IHRyYW5zbG9jbyB9fVxuICAgIDwvYT5cbiAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmRcIlxuICAgICAgZGF0YS1jeT1cImFkZC1jb250YWN0XCJcbiAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmNvbnRhY3RBZGRdXCJcbiAgICAgICpuZ0lmPVwiIWFjY291bnREYXRhPy5uYW1lXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAge3sgJ0NybS5Db250YWN0TWVzc2FnZS5BZGRDb250YWN0JyB8IHRyYW5zbG9jbyB9fVxuICAgIDwvYT5cbiAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBtZS0zIGZsb2F0LWVuZFwiXG4gICAgICBkYXRhLWN5PVwibGlzdC1jb250YWN0XCJcbiAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmNvbnRhY3RzXVwiXG4gICAgICAqbmdJZj1cImFjY291bnREYXRhPy5uYW1lXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtbGlzdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuU2hvd0FsbENvbnRhY3RzJyB8IHRyYW5zbG9jbyB9fVxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCJcbiAgKm5nSWY9XCIhaXNMb2FkZWRcIj5cbiAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICBbY2xhc3MuaGlkZVRhYmxlXT1cImRhdGEudW5maWx0ZXJlZF9jb3VudCA9PT0gMFwiPlxuICA8cC10YWJsZSBjbGFzcz1cInRhYmxlXCJcbiAgICAjZHRcbiAgICBbdmFsdWVdPVwiZGF0YS5jb250YWN0c1wiXG4gICAgW3BhZ2luYXRvcl09XCJkYXRhLm9iamVjdF9jb3VudCAhPT0gMFwiXG4gICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcbiAgICBbdG90YWxSZWNvcmRzXT1cImRhdGEub2JqZWN0X2NvdW50XCJcbiAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICBbbGF6eV09XCJ0cnVlXCJcbiAgICBbZmlsdGVyRGVsYXldPVwiMTAwMFwiXG4gICAgc3RhdGVTdG9yYWdlPVwibG9jYWxcIlxuICAgIHN0YXRlS2V5PVwic21hcnQtY3JtLWNvbnRhY3RzXCJcbiAgICAob25MYXp5TG9hZCk9XCJvbkxhenlMb2FkKCRldmVudClcIlxuICAgIFtjdXN0b21Tb3J0XT1cInRydWVcIj5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgY29sLTYgbWItc20tMCBtYi0wXCI+XG4gICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJwb3RlbnRpYWxcIlxuICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQnlQb3RlbnRpYWxzXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgUHJpb3JpdHknXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImZpbHRlckJ5UG90ZW50aWFsKCRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMyBjb2wtNlwiPlxuICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZExhYmVsc1wiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IExhYmVsXCIgW29wdGlvbnNdPVwibGFiZWxzXCIgW2ZpbHRlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2hvd0hlYWRlcl09XCJ0cnVlXCIgW3Nob3dUb2dnbGVBbGxdPVwidHJ1ZVwiIChvbkNoYW5nZSk9XCJvbkxhYmVsQ2hhbmdlKCRldmVudClcIiBhcHBlbmRUbz1cImJvZHlcIj5cbiAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gbXVsdGlwbGUgc2VsZWN0IGFjY291bnQgZHJvcCBkb3duIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgY29sLTZcIj5cbiAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRBY2NvdW50XCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQWNjb3VudFwiIFtvcHRpb25zXT1cImFjY291bnREcm9wRG93blwiIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIiBvcHRpb25MYWJlbD1cIm5hbWVcIiAob25DaGFuZ2UpPVwib25TZWxlY3RBY2NvdW50KClcIiBhcHBlbmRUbz1cImJvZHlcIj5cbiAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMyBjb2wtbWQtNCBjb2wtbGctM1wiPlxuICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoIG10LTIgbWUtMlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiBwSW5wdXRUZXh0IHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNvbnRhY3QuLi5cIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiZHQuZmlsdGVyR2xvYmFsKCRldmVudC50YXJnZXQudmFsdWUsICdjb250YWlucycpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuXG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICA8dHI+XG4gICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImZpcnN0X25hbWVcIj5cbiAgICAgICAgICB7eyAnQ3JtLkNvbnRhY3RNZXNzYWdlLk5hbWUnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJmaXJzdF9uYW1lXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJvd25lcl9pZFwiPlxuICAgICAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuQ29udGFjdE93bmVyJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwib3duZXJfaWRcIj48L3Atc29ydEljb24+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImNybV9hY2NvdW50X2lkXCI+XG4gICAgICAgICAge3sgJ0NybS5Db250YWN0TWVzc2FnZS5BY2NvdW50T3duZXInIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJjcm1fYWNjb3VudF9pZFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwibGFiZWxzXCI+XG4gICAgICAgICAge3sgJ0NybS5Db250YWN0TWVzc2FnZS5MYWJlbHMnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJsYWJlbHNcIj48L3Atc29ydEljb24+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cInBvdGVudGlhbFwiPlxuICAgICAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuUG90ZW50aWFsJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwicG90ZW50aWFsXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0xhYmVsLkFjdGlvbnMnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICBsZXQtY29udGFjdD5cbiAgICAgIDx0cj5cbiAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk5hbWVcIlxuICAgICAgICBjbGFzcz1cImNvbnRhY3RuYW1lXCI+XG4gICAgICAgICAgPGEgbmdiVG9vbHRpcD1cInt7Y29udGFjdC5oZWFkbGluZSA/IGNvbnRhY3QuaGVhZGxpbmUgOiAnTm8gaGVhZGxpbmUgZm9yIHRoaXMgY29udGFjdCd9fVwiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmNvbnRhY3RJbmZvLCBjb250YWN0LmlkXVwiPnt7IChjb250YWN0Py5maXJzdF9uYW1lIHx8ICcnKSArICcgJyArIChjb250YWN0Py5sYXN0X25hbWUgfHwgJycpIHwgdGV4dFRydW5jYXRlOiAyMCB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk93bmVyTmFtZVwiPnt7IGNvbnRhY3Qub3duZXIgfCBpZk5hbWVOdWxsU2hvd0VtYWlsIH19PC90ZD5cbiAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkFjY291bnQgTmFtZVwiPlxuICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmFjY291bnRJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuY3JtX2FjY291bnQuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cIiBuZ2JUb29sdGlwPVwie3tjb250YWN0Py5jcm1fYWNjb3VudC5uYW1lfX1cIj57eyBjb250YWN0Py5jcm1fYWNjb3VudC5uYW1lIHwgdGV4dFRydW5jYXRlOiAyMCB9fTwvYT5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkxhYmVsc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctaW5mbyBtLTFcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29udGFjdC5sYWJlbHNcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlBvdGVudGlhbFwiPlxuICAgICAgICAgIDxzcGFuIFthcHBEeW5hbWljQmFkZ2VdPVwieyBpdGVtc0FycmF5OiBwb3RlbnRpYWwsIGl0ZW06IGNvbnRhY3QucG90ZW50aWFsIH1cIlxuICAgICAgICAgICAgY29sb3I9XCJ3YXJuaW5nXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYmFkZ2VcIj57eyBjb250YWN0LnBvdGVudGlhbCB9fTwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkFjdGlvblwiPlxuICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbGlzdC1pbmxpbmUgbGlzdC1hY3Rpb25cIj5cbiAgICAgICAgICAgIDxsaSBuZ2JUb29sdGlwPVwiU2hvd1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyAnL2NybS9jb250YWN0cy9pbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1leWUgc2VlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FjY2VzcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0Lm93bmVyX2lkID09PSB1c2VySWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5jcm1fYWNjb3VudC5vd25lcl9pZCA9PT0gdXNlcklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkFkZCBvcHBvcnR1bml0eVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMub3Bwb3J0dW5pdHlBZGRdXCJcbiAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInsgY29udGFjdF9pZDogY29udGFjdC5pZCB9XCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cy1jaXJjbGUgYWRkLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FjY2VzcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0Lm93bmVyX2lkID09PSB1c2VySWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5jcm1fYWNjb3VudC5vd25lcl9pZCA9PT0gdXNlcklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkVkaXRcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1lLTIgbWUtc20tM1wiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0RGV0YWlscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWNjZXNzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3Qub3duZXJfaWQgPT09IHVzZXJJZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0LmNybV9hY2NvdW50Lm93bmVyX2lkID09PSB1c2VySWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiRGVsZXRlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yIG1lLXNtLTNcIj5cbiAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaCBkZWxldGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uRGVsZXRlKGNvbnRhY3QuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25EZWxldGUoY29udGFjdC5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGUoY29udGFjdC5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC10YWJsZT5cbiAgPGRpdiAqbmdJZj1cImRhdGEub2JqZWN0X2NvdW50ID09PSAwICYmIGRhdGEudW5maWx0ZXJlZF9jb3VudCAhPT0gMFwiPlxuICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidTZWFyY2guTm9EYXRhTWVzc2FnZSd8IHRyYW5zbG9jb1wiIFtkZXNjcmlwdGlvbl09XCInU2VhcmNoLk5vRGF0YURlc2NyaXB0aW9uJyB8IHRyYW5zbG9jb1wiID5cbiAgICA8L3B3LW5vLWRhdGE+XG48L2Rpdj5cbiAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJkYXRhLm9iamVjdF9jb3VudCAhPT0gMFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IGRhdGEub2JqZWN0X2NvdW50IH19PC9zcGFuPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwiZGF0YS51bmZpbHRlcmVkX2NvdW50ID09PSAwICYmIGlzTG9hZGVkXCI+XG4gIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uQ29udGFjdE1lc3NhZ2UuQ29udGFjdHNBZG1pbk1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+IDwvcHctbm8tZGF0YT5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwicm93IG10LTVcIlxuICAgICpuZ0lmPVwiaXNMb2FkZWQgJiYgIWFjY291bnREYXRhPy5uYW1lXCI+XG4gICAgPCEtLSBEcmlsbCBEb3duIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+V2F0Y2ggQ2xvc2VseTwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cImNvbnRhY3RJbnNpZ2h0Py5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgICAgICAgI2R0XG4gICAgICAgICAgW3ZhbHVlXT1cImNvbnRhY3RJbnNpZ2h0XCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cImNvbnRhY3RJbnNpZ2h0Py5sZW5ndGggIT09IDBcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJjb250YWN0SW5zaWdodC5sZW5ndGhcIlxuICAgICAgICAgIFtsYXp5XT1cInRydWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LlRpdGxlJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLkNvbnRhY3RNZXNzYWdlLlJlYXNvbicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgICAgIGxldC1pbnNpZ2h0PlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQ29udGFjdFwiPlxuICAgICAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmNvbnRhY3RJbmZvLCBpbnNpZ2h0LmNybV9jb250YWN0X2lkXVwiIGNsYXNzPVwibmFtZS1saW5rXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbbmdiVG9vbHRpcF09XCJpbnNpZ2h0Py5uYW1lXCI+e3sgaW5zaWdodD8ubmFtZSB8IHRleHRUcnVuY2F0ZToyMCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJIZWFkbGluZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiaW5zaWdodD8uaGVhZGxpbmVcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHRvb2x0aXBDbGFzcz1cImN1c3RvbS10b29sdGlwXCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBpbnNpZ2h0Py5oZWFkbGluZSB8IHRleHRUcnVuY2F0ZTogMjAgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiUmVhc29uXCI+XG4gICAgICAgICAgICAgICAge3sgaW5zaWdodC5yZWFzb24gfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cImNvbnRhY3RJbnNpZ2h0Py5sZW5ndGggIT09IDBcIj5Ub3RhbDoge3sgY29udGFjdEluc2lnaHQubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWNvbnRhY3RJbnNpZ2h0Py5sZW5ndGhcIj5cbiAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5Db250YWN0TWVzc2FnZS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEdlb2dyYXBoeSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPkNvbnRhY3RzIExvY2F0aW9uPC9oNT5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJjb250YWN0R2VvZ3JhcGh5XCI+XG4gICAgICAgICAgPHBsb3RseS1wbG90IFtkYXRhXT1cImNvbnRhY3RHZW9ncmFwaHk/LmRhdGFcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb250YWN0R2VvZ3JhcGh5Py5jb25maWdcIlxuICAgICAgICAgICAgW2xheW91dF09XCJjb250YWN0R2VvZ3JhcGh5Py5sYXlvdXRcIiAgW3VzZVJlc2l6ZUhhbmRsZXJdPVwiY29udGFjdEdlb2dyYXBoeSA/IHRydWUgOiBmYWxzZVwiPlxuICAgICAgICAgIDwvcGxvdGx5LXBsb3Q+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhY29udGFjdEdlb2dyYXBoeVwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLkNvbnRhY3RNZXNzYWdlLk5vSW5zaWdodE1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgIDwvcHctbm8tZGF0YT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLWNvbnRhY3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc21hcnQtY3JtL3NyYy9saWIvcHJpdmF0ZS9jb21wb25lbnRzL3NtYXJ0LWNybS1jb250YWN0cy9zbWFydC1jcm0tY29udGFjdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLWNvbnRhY3RzL3NtYXJ0LWNybS1jb250YWN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBR1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQXNDLE1BQU0sNEJBQTRCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUszQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU8xRCxNQUFNLE9BQU8sd0JBQ1QsU0FBUSxnQkFBZ0I7SUF3Q3hCLFlBQ3FCLFVBQXNCLEVBQ3ZDLFFBQWtCLEVBQ0QsR0FBc0I7UUFFdkMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSkMsZUFBVSxHQUFWLFVBQVUsQ0FB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QzNELElBQUksS0FBSyxZQUFZLGFBQWEsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUNsRCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0FuVVEsd0JBQXdCO21HQUF4Qix3QkFBd0IsOEVDN0JyQyw0aVpBcVNBOzs0RkR4UWEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNJLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSW5qZWN0b3IsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBQQUdFX1NJWkUsIFBhZ2luZywgUGxvdGx5LCBTdWJzY3JpcHRpb24sIFVzZXIgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB7IExhenlMb2FkRXZlbnQgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENybUFjY291bnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL2NybS1hY2NvdW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm1Db250YWN0UmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL2NybS1jb250YWN0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBPcHBvcnR1bml0eUluc2lnaHQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL3NtYXJ0LWNybS1tb2R1bGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJPVVRFUlMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcm91dGVycy9yb3V0ZXJzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwdy1jcm0tY29udGFjdHMnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zbWFydC1jcm0tY29udGFjdHMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NtYXJ0LWNybS1jb250YWN0cy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0Q3JtQ29udGFjdENvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWRcbntcbiAgICBwcml2YXRlIHBhZ2UgPSAxO1xuXG4gICAgZGF0YTogQ3JtQ29udGFjdFJlc3BvbnNlID0ge1xuICAgICAgICBjb250YWN0czogW10sXG4gICAgICAgIG9iamVjdF9jb3VudDogMCxcbiAgICAgICAgdW5maWx0ZXJlZF9jb3VudDogMFxuICAgIH07XG5cbiAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBzdWJzY3JpcHRpb25JZDogbnVtYmVyO1xuXG4gICAgY29udGFjdElkOiBudW1iZXI7XG4gICAgYWNjb3VudElkOiBudW1iZXI7XG4gICAgYWNjb3VudERhdGE6IENybUFjY291bnQ7XG4gICAgdXNlcklkOiBudW1iZXI7XG4gICAgdXNlcjogVXNlcjtcblxuICAgIGNvbnRhY3RJbnNpZ2h0OiBPcHBvcnR1bml0eUluc2lnaHRbXTtcbiAgICBjb250YWN0R2VvZ3JhcGh5OiBQbG90bHkuRmlndXJlO1xuXG4gICAgZmlsdGVyQnlQb3RlbnRpYWxzOiBzdHJpbmc7XG4gICAgZmlsdGVyQnlTdGF0dXM6IHN0cmluZztcbiAgICBwb3RlbnRpYWwgPSBbXTtcbiAgICBsYWJlbHMgPSBbXTtcbiAgICBzZWxlY3RlZExhYmVscyA9IFtdO1xuICAgIHNlbGVjdGVkQWNjb3VudCA9IFtdO1xuICAgIGFjY291bnREcm9wRG93biA9IFtdO1xuICAgIGNybUFjY291bnRJZHM6IHN0cmluZztcblxuICAgIHNlYXJjaFRleHQgPSAnJztcblxuICAgIGxvYWRpbmcgPSB0cnVlO1xuICAgIGhhc0FjY2VzcyA9IGZhbHNlO1xuICAgIGlzTG9hZGVkID0gZmFsc2U7XG5cbiAgICByb3V0ZXJzID0gUk9VVEVSUztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNybVNlcnZpY2U6IENybVNlcnZpY2UsXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250YWN0SWQgPSBOdW1iZXIoZGF0YVsnYWNjb3VudElkJ10pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXREZWZhdWx0VmFsdWVzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZVN0YXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNBY2Nlc3MgPSB0aGlzLmhhc0FkbWluQWNjZXNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mbygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudHNEcm9wZG93bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgLyoqZ2V0IGFjY291bnRzIGRyb3Bkb3duICovXG4gICAgcHVibGljIGdldEFjY291bnRzRHJvcGRvd24oKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZS5nZXRBbGxBY2NvdW50cyh7IHN1YnNjcmlwdGlvbl9pZDogdGhpcy5zdWJzY3JpcHRpb24/LmlkIH0pLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudERyb3BEb3duID0gcmVzPy5hY2NvdW50cy5tYXAoeCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogeD8uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB4Py5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipzZWxlY3Qgb3B0aW9uIGZyb20gYWNjb3VudCBkcm9wZG93biAqL1xuICAgIG9uU2VsZWN0QWNjb3VudCgpIHtcbiAgICAgICAgdGhpcy5jcm1BY2NvdW50SWRzID0gdGhpcy5zZWxlY3RlZEFjY291bnQubWFwKHkgPT4geS5pZCkuam9pbigpO1xuICAgICAgICB0aGlzLmdldEFsbENvbnRhY3RzKHtcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFRhYmxlU3RhdGUoKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9XG4gICAgICAgICAgICBKU09OLnBhcnNlKHRoaXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NtYXJ0LWNybS1jb250YWN0cycpKT8uZmlsdGVycz8uZ2xvYmFsLnZhbHVlID8/XG4gICAgICAgICAgICAnJztcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGhpcy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY3JtQ29udGFjdHNTdGF0ZScpKTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVN0YXR1cyA9IGRhdGE/LmxhYmVsO1xuICAgICAgICB0aGlzLmZpbHRlckJ5UG90ZW50aWFscyA9IGRhdGE/LnBvdGVudGlhbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVscyA9IGRhdGE/LmxhYmVsID8gZGF0YT8ubGFiZWwuc3BsaXQoJywnKSA6IFtdO1xuICAgIH1cblxuICAgIG9uTGF6eUxvYWQoZXZlbnQ6IExhenlMb2FkRXZlbnQpIHtcbiAgICAgICAgY29uc3QgcGFnZURldGFpbHMgPSBIZWxwZXJTZXJ2aWNlLm9uVGFibGVMYXp5TG9hZChldmVudCk7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2VEZXRhaWxzLnBhZ2U7XG4gICAgICAgIHRoaXMuZ2V0RGF0YSh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgIG9yZGVyX2J5OiBwYWdlRGV0YWlscy5zb3J0RmllbGQsXG4gICAgICAgICAgICBvcmRlcl9kaXJlY3Rpb246IHBhZ2VEZXRhaWxzLnNvcnRPcmRlcixcbiAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0YShwYWdpbmc6IFBhZ2luZykge1xuICAgICAgICBpZiAodGhpcy5jb250YWN0SWQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmdldEFjY291bnRDb250YWN0cyhwYWdpbmcpO1xuICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50RGV0YWlsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldEFsbENvbnRhY3RzKHBhZ2luZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHVzZXIgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0VXNlckluZm8oKSB7XG4gICAgICAgIHRoaXMudXNlclN0b3JlKCkuc3Vic2NyaWJlKHVzZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgICAgIHRoaXMudXNlcklkID0gdXNlci5pZDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uU2VydmljZS5pc0dyYW50ZWQoJ1BhZ2VzLkJldGEnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRhY3RJbnNpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udGFjdEdlb2dyYXBoeSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGdldCBhbGwgY29udGFjdHMgKi9cbiAgICBwcml2YXRlIGdldEFsbENvbnRhY3RzKHBhZ2luZzogUGFnaW5nKSB7XG4gICAgICAgIHRoaXMuZ2V0VXNlclN1YnNjcmlwdGlvbklkKCkuc3Vic2NyaWJlKGlkID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBpZDtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRBbGxDb250YWN0cyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckJ5UG90ZW50aWFscyB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyQnlTdGF0dXMgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNybUFjY291bnRJZHMgfHwgJydcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHRoZSBjb250YWN0cyByZWxhdGVkIHRvIGFjY291bnRzICovXG4gICAgcHJpdmF0ZSBnZXRBY2NvdW50Q29udGFjdHMocGFnaW5nOiBQYWdpbmcpIHtcbiAgICAgICAgdGhpcy5kYXRhLmNvbnRhY3RzID0gW107XG4gICAgICAgIHRoaXMuZ2V0VXNlclN1YnNjcmlwdGlvbklkKCkuc3Vic2NyaWJlKGlkID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBpZDtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRBY2NvdW50Q29udGFjdHMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckJ5UG90ZW50aWFscyB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyQnlTdGF0dXMgfHwgJydcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHRoZSBhY2NvdW50IG5hbWUgKi9cbiAgICBwcml2YXRlIGdldEFjY291bnREZXRhaWwoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldEFjY291bnREZXRhaWwodGhpcy5zdWJzY3JpcHRpb24/LmlkLCB0aGlzLmNvbnRhY3RJZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudERhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY291bnRJZCA9IHJlc3BvbnNlLmlkO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGRlbGV0ZSBjb250YWN0ICovXG4gICAgb25EZWxldGUoaWQ6IG51bWJlcikge1xuICAgICAgICBIZWxwZXJTZXJ2aWNlLnJhaXNlRGVsZXRlUG9wdXAoKS50aGVuKHJlc3AgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3AudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNybVNlcnZpY2UuZGVsZXRlQ29udGFjdCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGlkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQ3JtLkNvbnRhY3RNZXNzYWdlLkRlbGV0ZWRNZXNzYWdlJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmNvbnRhY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhY3RJZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudENvbnRhY3RzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmNvbnRhY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbENvbnRhY3RzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBmaWx0ZXIgYnkgcG90ZW50aWFsICovXG4gICAgZmlsdGVyQnlQb3RlbnRpYWwoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVBvdGVudGlhbHMgPSBldmVudDtcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSQoXG4gICAgICAgICAgICAnY3JtQ29udGFjdHNTdGF0ZScsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7IGxhYmVsOiB0aGlzLmZpbHRlckJ5U3RhdHVzLCBwb3RlbnRpYWw6IHRoaXMuZmlsdGVyQnlQb3RlbnRpYWxzIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhY3RJZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudENvbnRhY3RzKHtcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50RGV0YWlsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldEFsbENvbnRhY3RzKHtcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgY29udGFjdCBpbnNpZ2h0ICovXG4gICAgcHJpdmF0ZSBnZXRDb250YWN0SW5zaWdodCgpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2NvbnRhY3RzX2luc2lnaHRzJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEFQSSBub3cgcmV0dXJucyB7IGl0ZW1zOiBbXSwgdG90YWxzOiB7fSB9IGluc3RlYWQgb2YgYXJyYXlcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHJlc3BvbnNlPy5pdGVtcyB8fCByZXNwb25zZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW1zID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhpdGVtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEluc2lnaHQgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RJbnNpZ2h0ID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIGNvbnRhY3QgZ2VvZ3JhcGh5ICovXG4gICAgZ2V0Q29udGFjdEdlb2dyYXBoeSgpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2NvbnRhY3RzX2dlb2dyYXBoeScpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBUEkgbm93IHJldHVybnMgeyBpdGVtczogW10sIHRvdGFsczoge30gfSBpbnN0ZWFkIG9mIGFycmF5L29iamVjdFxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdEdlb2dyYXBoeSA9IHJlc3BvbnNlPy5pdGVtcyB8fCByZXNwb25zZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5hdmlnYXRlVG9PcHBvcnR1bml0aWVzKCkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYC8ke3RoaXMuc3Vic2NyaXB0aW9uPy5zbHVnfSR7dGhpcy5yb3V0ZXJzLm9wcG9ydHVuaXR5QWRkfWBdLCB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtczogeyBhY2NvdW50X2lkOiB0aGlzLmFjY291bnRJZCB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRWYWx1ZXMoaWQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2UuZ2V0Q3JtQ29udGFjdERlZmF1bHRWYWx1ZXMoaWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5wb3RlbnRpYWwgPSBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ1NlbGVjdCBQcmlvcml0eScsIHZhbHVlOiBudWxsIH0sXG4gICAgICAgICAgICAgICAgLi4uKHJlc1sncG90ZW50aWFsJ10gPz8gW10pLm1hcChpdGVtID0+ICh7IGxhYmVsOiBpdGVtLCB2YWx1ZTogaXRlbSB9KSlcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHJlc1snbGFiZWxzJ107XG4gICAgICAgICAgICBsYWJlbC5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHZhbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5nZXRUYWJsZVN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uTGFiZWxDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVN0YXR1cyA9IGV2ZW50LnZhbHVlLmpvaW4oKTtcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSQoXG4gICAgICAgICAgICAnY3JtQ29udGFjdHNTdGF0ZScsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7IGxhYmVsOiB0aGlzLmZpbHRlckJ5U3RhdHVzLCBwb3RlbnRpYWw6IHRoaXMuZmlsdGVyQnlQb3RlbnRpYWxzIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhY3RJZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudENvbnRhY3RzKHtcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50RGV0YWlsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldEFsbENvbnRhY3RzKHtcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWVyID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUodGFrZVVudGlsKG5vdGlmaWVyKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLmluY2x1ZGVzKCcvY29udGFjdHMnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtJCgnc21hcnQtY3JtLWNvbnRhY3RzJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0kKCdjcm1Db250YWN0c1N0YXRlJyk7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItM1wiPlxuICAgIDxoMiAqbmdJZj1cIiFhY2NvdW50RGF0YT8ubmFtZVwiPkNvbnRhY3RzPC9oMj5cbiAgICA8aDMgKm5nSWY9XCJhY2NvdW50RGF0YT8ubmFtZVwiXG4gICAgICBjbGFzcz1cIm1iLTJcIj5cbiAgICAgIHt7IGFjY291bnREYXRhLm5hbWUgfX1cbiAgICAgIDxzcGFuICpuZ0lmPVwiaGFzQWNjZXNzIHx8IGFjY291bnREYXRhLm93bmVyX2lkID09PSB1c2VySWRcIiBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5hY2NvdW50cywgYWNjb3VudERhdGEuaWRdXCI+PGkgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L3NwYW4+XG4gICAgPC9oMz5cbiAgICA8aDQgKm5nSWY9XCJhY2NvdW50RGF0YT8ubG9jYXRpb25cIlxuICAgICAgY2xhc3M9XCJtYi0xXCI+TG9jYXRpb246IHt7IGFjY291bnREYXRhLmxvY2F0aW9uIH19PC9oND5cbiAgICA8aDQgKm5nSWY9XCJhY2NvdW50RGF0YT8udGVsXCI+VGVsOiB7eyBhY2NvdW50RGF0YS50ZWwgfX08L2g0PlxuICAgIDxoNCAqbmdJZj1cImFjY291bnREYXRhPy5jb21wYW55X3VybFwiPlxuICAgICAgVVJMOlxuICAgICAgPGEgaHJlZj1cInt7IGFjY291bnREYXRhLmNvbXBhbnlfdXJsIH19XCJcbiAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlxuICAgICAgICB7eyBhY2NvdW50RGF0YS5jb21wYW55X3VybCB9fVxuICAgICAgPC9hPlxuICAgIDwvaDQ+XG4gICAgPGEgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgZmxvYXQtZW5kIG1iLTMgbXMtMlwiXG4gICAgICBkYXRhLWN5PVwiYWRkLW9wcG9ydHVuaXRpZXNcIlxuICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlVG9PcHBvcnR1bml0aWVzKClcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cy1jaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICB7eyAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLkFkZE9wcG9ydHVuaXR5JyB8IHRyYW5zbG9jbyB9fVxuICAgIDwvYT5cbiAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmRcIlxuICAgICAgZGF0YS1jeT1cImFkZC1jb250YWN0XCJcbiAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmNvbnRhY3RBZGQsIGFjY291bnRJZF1cIlxuICAgICAgKm5nSWY9XCJhY2NvdW50RGF0YT8ubmFtZVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuQWRkQ29udGFjdCcgfCB0cmFuc2xvY28gfX1cbiAgICA8L2E+XG4gICAgPGEgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgZmxvYXQtZW5kXCJcbiAgICAgIGRhdGEtY3k9XCJhZGQtY29udGFjdFwiXG4gICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0QWRkXVwiXG4gICAgICAqbmdJZj1cIiFhY2NvdW50RGF0YT8ubmFtZVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuQWRkQ29udGFjdCcgfCB0cmFuc2xvY28gfX1cbiAgICA8L2E+XG4gICAgPGEgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWUtMyBmbG9hdC1lbmRcIlxuICAgICAgZGF0YS1jeT1cImxpc3QtY29udGFjdFwiXG4gICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0c11cIlxuICAgICAgKm5nSWY9XCJhY2NvdW50RGF0YT8ubmFtZVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWxpc3RcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICB7eyAnQ3JtLkNvbnRhY3RNZXNzYWdlLlNob3dBbGxDb250YWN0cycgfCB0cmFuc2xvY28gfX1cbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiXG4gICpuZ0lmPVwiIWlzTG9hZGVkXCI+XG4gIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInByaW1lbmctZGF0YXRhYmxlLWNvbnRhaW5lciB0YWJsZS1yZXNwb25zaXZlXCJcbiAgW2NsYXNzLmhpZGVUYWJsZV09XCJkYXRhLnVuZmlsdGVyZWRfY291bnQgPT09IDBcIj5cbiAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgI2R0XG4gICAgW3ZhbHVlXT1cImRhdGEuY29udGFjdHNcIlxuICAgIFtwYWdpbmF0b3JdPVwiZGF0YS5vYmplY3RfY291bnQgIT09IDBcIlxuICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgW3RvdGFsUmVjb3Jkc109XCJkYXRhLm9iamVjdF9jb3VudFwiXG4gICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gICAgW2xhenldPVwidHJ1ZVwiXG4gICAgW2ZpbHRlckRlbGF5XT1cIjEwMDBcIlxuICAgIHN0YXRlU3RvcmFnZT1cImxvY2FsXCJcbiAgICBzdGF0ZUtleT1cInNtYXJ0LWNybS1jb250YWN0c1wiXG4gICAgKG9uTGF6eUxvYWQpPVwib25MYXp5TG9hZCgkZXZlbnQpXCJcbiAgICBbY3VzdG9tU29ydF09XCJ0cnVlXCI+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0zIGNvbC02IG1iLXNtLTAgbWItMFwiPlxuICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwicG90ZW50aWFsXCJcbiAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlckJ5UG90ZW50aWFsc1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IFByaW9yaXR5J1wiXG4gICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJmaWx0ZXJCeVBvdGVudGlhbCgkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgY29sLTZcIj5cbiAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRMYWJlbHNcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBMYWJlbFwiIFtvcHRpb25zXT1cImxhYmVsc1wiIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIiAob25DaGFuZ2UpPVwib25MYWJlbENoYW5nZSgkZXZlbnQpXCIgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIG11bHRpcGxlIHNlbGVjdCBhY2NvdW50IGRyb3AgZG93biAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0zIGNvbC02XCI+XG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQWNjb3VudFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEFjY291bnRcIiBbb3B0aW9uc109XCJhY2NvdW50RHJvcERvd25cIiBbZmlsdGVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cInRydWVcIiBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgKG9uQ2hhbmdlKT1cIm9uU2VsZWN0QWNjb3VudCgpXCIgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgY29sLW1kLTQgY29sLWxnLTNcIj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCBtdC0yIG1lLTJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgcElucHV0VGV4dCBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjb250YWN0Li4uXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImR0LmZpbHRlckdsb2JhbCgkZXZlbnQudGFyZ2V0LnZhbHVlLCAnY29udGFpbnMnKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgLz5cbiAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgPHRyPlxuICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJmaXJzdF9uYW1lXCI+XG4gICAgICAgICAge3sgJ0NybS5Db250YWN0TWVzc2FnZS5OYW1lJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiZmlyc3RfbmFtZVwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwib3duZXJfaWRcIj5cbiAgICAgICAgICB7eyAnQ3JtLkNvbnRhY3RNZXNzYWdlLkNvbnRhY3RPd25lcicgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cIm93bmVyX2lkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJjcm1fYWNjb3VudF9pZFwiPlxuICAgICAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuQWNjb3VudE93bmVyJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiY3JtX2FjY291bnRfaWRcIj48L3Atc29ydEljb24+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImxhYmVsc1wiPlxuICAgICAgICAgIHt7ICdDcm0uQ29udGFjdE1lc3NhZ2UuTGFiZWxzJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwibGFiZWxzXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJwb3RlbnRpYWxcIj5cbiAgICAgICAgICB7eyAnQ3JtLkNvbnRhY3RNZXNzYWdlLlBvdGVudGlhbCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInBvdGVudGlhbFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdMYWJlbC5BY3Rpb25zJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgbGV0LWNvbnRhY3Q+XG4gICAgICA8dHI+XG4gICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJOYW1lXCJcbiAgICAgICAgY2xhc3M9XCJjb250YWN0bmFtZVwiPlxuICAgICAgICAgIDxhIG5nYlRvb2x0aXA9XCJ7e2NvbnRhY3QuaGVhZGxpbmUgPyBjb250YWN0LmhlYWRsaW5lIDogJ05vIGhlYWRsaW5lIGZvciB0aGlzIGNvbnRhY3QnfX1cIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbywgY29udGFjdC5pZF1cIj57eyAoY29udGFjdD8uZmlyc3RfbmFtZSB8fCAnJykgKyAnICcgKyAoY29udGFjdD8ubGFzdF9uYW1lIHx8ICcnKSB8IHRleHRUcnVuY2F0ZTogMjAgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lck5hbWVcIj57eyBjb250YWN0Lm93bmVyIHwgaWZOYW1lTnVsbFNob3dFbWFpbCB9fTwvdGQ+XG4gICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50IE5hbWVcIj5cbiAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5hY2NvdW50SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0LmNybV9hY2NvdW50LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICBdXCIgbmdiVG9vbHRpcD1cInt7Y29udGFjdD8uY3JtX2FjY291bnQubmFtZX19XCI+e3sgY29udGFjdD8uY3JtX2FjY291bnQubmFtZSB8IHRleHRUcnVuY2F0ZTogMjAgfX08L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJMYWJlbHNcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWluZm8gbS0xXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbnRhY3QubGFiZWxzXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJQb3RlbnRpYWxcIj5cbiAgICAgICAgICA8c3BhbiBbYXBwRHluYW1pY0JhZGdlXT1cInsgaXRlbXNBcnJheTogcG90ZW50aWFsLCBpdGVtOiBjb250YWN0LnBvdGVudGlhbCB9XCJcbiAgICAgICAgICAgIGNvbG9yPVwid2FybmluZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImJhZGdlXCI+e3sgY29udGFjdC5wb3RlbnRpYWwgfX08L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY3Rpb25cIj5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIGxpc3QtaW5saW5lIGxpc3QtYWN0aW9uXCI+XG4gICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIlNob3dcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1lLTIgbWUtc20tM1wiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgJy9jcm0vY29udGFjdHMvaW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZXllIHNlZS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBY2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5vd25lcl9pZCA9PT0gdXNlcklkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuY3JtX2FjY291bnQub3duZXJfaWQgPT09IHVzZXJJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJBZGQgb3Bwb3J0dW5pdHlcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1lLTIgbWUtc20tM1wiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLm9wcG9ydHVuaXR5QWRkXVwiXG4gICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJ7IGNvbnRhY3RfaWQ6IGNvbnRhY3QuaWQgfVwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlIGFkZC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBY2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5vd25lcl9pZCA9PT0gdXNlcklkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuY3JtX2FjY291bnQub3duZXJfaWQgPT09IHVzZXJJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJFZGl0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yIG1lLXNtLTNcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuY29udGFjdERldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWRpdCBlZGl0LWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FjY2VzcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0Lm93bmVyX2lkID09PSB1c2VySWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5jcm1fYWNjb3VudC5vd25lcl9pZCA9PT0gdXNlcklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCI+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkRlbGV0ZShjb250YWN0LmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9uRGVsZXRlKGNvbnRhY3QuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKGNvbnRhY3QuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+XG4gIDxkaXYgKm5nSWY9XCJkYXRhLm9iamVjdF9jb3VudCA9PT0gMCAmJiBkYXRhLnVuZmlsdGVyZWRfY291bnQgIT09IDBcIj5cbiAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInU2VhcmNoLk5vRGF0YU1lc3NhZ2UnfCB0cmFuc2xvY29cIiBbZGVzY3JpcHRpb25dPVwiJ1NlYXJjaC5Ob0RhdGFEZXNjcmlwdGlvbicgfCB0cmFuc2xvY29cIiA+XG4gICAgPC9wdy1uby1kYXRhPlxuPC9kaXY+XG4gIDxzcGFuIGNsYXNzPVwidG90YWwtcmVjb3Jkcy1jb3VudFwiICpuZ0lmPVwiZGF0YS5vYmplY3RfY291bnQgIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBkYXRhLm9iamVjdF9jb3VudCB9fTwvc3Bhbj5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cImRhdGEudW5maWx0ZXJlZF9jb3VudCA9PT0gMCAmJiBpc0xvYWRlZFwiPlxuICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLkNvbnRhY3RNZXNzYWdlLkNvbnRhY3RzQWRtaW5NZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cInJvdyBtdC01XCJcbiAgICAqbmdJZj1cImlzTG9hZGVkICYmICFhY2NvdW50RGF0YT8ubmFtZVwiPlxuICAgIDwhLS0gRHJpbGwgRG93biAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPldhdGNoIENsb3NlbHk8L2g1PlxuICAgICAgPGRpdiBjbGFzcz1cInByaW1lbmctZGF0YXRhYmxlLWNvbnRhaW5lciB0YWJsZS1yZXNwb25zaXZlXCJcbiAgICAgICAgKm5nSWY9XCJjb250YWN0SW5zaWdodD8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJjb250YWN0SW5zaWdodFwiXG4gICAgICAgICAgW3BhZ2luYXRvcl09XCJjb250YWN0SW5zaWdodD8ubGVuZ3RoICE9PSAwXCJcbiAgICAgICAgICBbcm93c109XCJQQUdFX1NJWkVcIlxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiY29udGFjdEluc2lnaHQubGVuZ3RoXCJcbiAgICAgICAgICBbbGF6eV09XCJ0cnVlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3QnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5UaXRsZScgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5Db250YWN0TWVzc2FnZS5SZWFzb24nIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICAgICAgICBsZXQtaW5zaWdodD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkNvbnRhY3RcIj5cbiAgICAgICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbywgaW5zaWdodC5jcm1fY29udGFjdF9pZF1cIiBjbGFzcz1cIm5hbWUtbGlua1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwiaW5zaWdodD8ubmFtZVwiPnt7IGluc2lnaHQ/Lm5hbWUgfCB0ZXh0VHJ1bmNhdGU6MjAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiSGVhZGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImluc2lnaHQ/LmhlYWRsaW5lXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgaW5zaWdodD8uaGVhZGxpbmUgfCB0ZXh0VHJ1bmNhdGU6IDIwIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlJlYXNvblwiPlxuICAgICAgICAgICAgICAgIHt7IGluc2lnaHQucmVhc29uIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJjb250YWN0SW5zaWdodD8ubGVuZ3RoICE9PSAwXCI+VG90YWw6IHt7IGNvbnRhY3RJbnNpZ2h0Lmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFjb250YWN0SW5zaWdodD8ubGVuZ3RoXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uQ29udGFjdE1lc3NhZ2UuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBHZW9ncmFwaHkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5Db250YWN0cyBMb2NhdGlvbjwvaDU+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiY29udGFjdEdlb2dyYXBoeVwiPlxuICAgICAgICAgIDxwbG90bHktcGxvdCBbZGF0YV09XCJjb250YWN0R2VvZ3JhcGh5Py5kYXRhXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiY29udGFjdEdlb2dyYXBoeT8uY29uZmlnXCJcbiAgICAgICAgICAgIFtsYXlvdXRdPVwiY29udGFjdEdlb2dyYXBoeT8ubGF5b3V0XCIgIFt1c2VSZXNpemVIYW5kbGVyXT1cImNvbnRhY3RHZW9ncmFwaHkgPyB0cnVlIDogZmFsc2VcIj5cbiAgICAgICAgICA8L3Bsb3RseS1wbG90PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWNvbnRhY3RHZW9ncmFwaHlcIj5cbiAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5Db250YWN0TWVzc2FnZS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==