ngx-dynamic-entity 1.1.0 → 1.2.0

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 (51) hide show
  1. package/esm2022/lib/field-types/array-field.component.mjs +13 -5
  2. package/esm2022/lib/field-types/boolean-field.component.mjs +4 -3
  3. package/esm2022/lib/field-types/checkbox-field.component.mjs +4 -3
  4. package/esm2022/lib/field-types/currency-field.component.mjs +4 -3
  5. package/esm2022/lib/field-types/date-field.component.mjs +4 -3
  6. package/esm2022/lib/field-types/dropdown-field.component.mjs +9 -7
  7. package/esm2022/lib/field-types/email-field.component.mjs +4 -3
  8. package/esm2022/lib/field-types/entity-ref-field.component.mjs +21 -7
  9. package/esm2022/lib/field-types/field-component.contract.mjs +2 -0
  10. package/esm2022/lib/field-types/file-field.component.mjs +4 -3
  11. package/esm2022/lib/field-types/group-field.component.mjs +5 -5
  12. package/esm2022/lib/field-types/image-field.component.mjs +4 -3
  13. package/esm2022/lib/field-types/month-year-field.component.mjs +4 -3
  14. package/esm2022/lib/field-types/multi-select-field.component.mjs +4 -3
  15. package/esm2022/lib/field-types/number-field.component.mjs +7 -11
  16. package/esm2022/lib/field-types/password-field.component.mjs +4 -3
  17. package/esm2022/lib/field-types/radio-field.component.mjs +4 -3
  18. package/esm2022/lib/field-types/text-field.component.mjs +25 -18
  19. package/esm2022/lib/field-types/textarea-field.component.mjs +4 -3
  20. package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +53 -6
  21. package/esm2022/lib/form/dynamic-form.component.mjs +131 -15
  22. package/esm2022/lib/form/dynamic-record-form.component.mjs +2 -2
  23. package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +7 -2
  24. package/esm2022/lib/services/cascade-data.service.mjs +2 -2
  25. package/esm2022/lib/services/entity-ref-registry.service.mjs +2 -2
  26. package/esm2022/lib/services/lookup-registry.service.mjs +2 -2
  27. package/esm2022/lib/services/validation-messages.service.mjs +56 -0
  28. package/esm2022/lib/services/validator-registry.service.mjs +24 -2
  29. package/esm2022/lib/tokens/injection-tokens.mjs +19 -6
  30. package/esm2022/public-api.mjs +6 -1
  31. package/fesm2022/ngx-dynamic-entity.mjs +373 -81
  32. package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
  33. package/lib/field-types/array-field.component.d.ts +7 -1
  34. package/lib/field-types/dropdown-field.component.d.ts +1 -0
  35. package/lib/field-types/entity-ref-field.component.d.ts +11 -1
  36. package/lib/field-types/field-component.contract.d.ts +49 -0
  37. package/lib/field-types/group-field.component.d.ts +1 -1
  38. package/lib/field-types/number-field.component.d.ts +1 -0
  39. package/lib/field-types/text-field.component.d.ts +10 -2
  40. package/lib/form/dynamic-field/dynamic-field.component.d.ts +39 -4
  41. package/lib/form/dynamic-form.component.d.ts +62 -2
  42. package/lib/providers/provide-ngx-dynamic-entity.d.ts +17 -1
  43. package/lib/services/cascade-data.service.d.ts +1 -1
  44. package/lib/services/entity-ref-registry.service.d.ts +1 -1
  45. package/lib/services/lookup-registry.service.d.ts +1 -1
  46. package/lib/services/validation-messages.service.d.ts +43 -0
  47. package/lib/services/validator-registry.service.d.ts +13 -1
  48. package/lib/tokens/injection-tokens.d.ts +18 -5
  49. package/package.json +2 -2
  50. package/public-api.d.ts +2 -0
  51. package/styles.css +579 -0
@@ -452,7 +452,7 @@ export class DynamicRecordFormComponent {
452
452
  }
453
453
  }
454
454
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicRecordFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
455
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DynamicRecordFormComponent, isStandalone: true, selector: "ngx-dynamic-record-form", inputs: { config: "config", rules: "rules", initialData: "initialData", userRoles: "userRoles", language: "language", readonly: "readonly", loading: "loading", error: "error", isReadOnly: "isReadOnly", readOnlyFields: "readOnlyFields", viewMode: "viewMode" }, outputs: { formSubmit: "formSubmit", formChange: "formChange", formReset: "formReset", sectionSave: "sectionSave" }, viewQueries: [{ propertyName: "dynamicFormComp", first: true, predicate: DynamicFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-record-editor\">\n <!-- Record Header -->\n <div class=\"ngx-record-editor__header\">\n <div class=\"ngx-record-editor__title-group\">\n @if (profileImageUrl) {\n <img\n class=\"ngx-record-editor__avatar\"\n data-testid=\"header-profile-image\"\n [src]=\"profileImageUrl\"\n [alt]=\"recordTitle\"\n />\n } @else {\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\n {{ avatarLetter }}\n </div>\n }\n <div>\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\n {{ recordTitle }}\n </h2>\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\n </div>\n </div>\n\n <!-- Record-level status switch, outside section editing -->\n @if (headerToggleField; as toggleField) {\n <label class=\"ngx-record-editor__header-toggle\">\n <span>{{ formatFieldLabel(toggleField) }}</span>\n <input\n type=\"checkbox\"\n role=\"switch\"\n data-testid=\"header-toggle\"\n [checked]=\"headerToggleValue\"\n [disabled]=\"recordReadOnly\"\n [attr.aria-checked]=\"headerToggleValue\"\n (change)=\"toggleHeaderStatus()\"\n />\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\n </label>\n }\n </div>\n\n <!-- Dismissible info banners (rules `info` action) -->\n @for (banner of infoBanners; track banner.fieldId) {\n <div\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\n role=\"status\"\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\n >\n <span>\u2139\uFE0F {{ banner.message }}</span>\n <button\n type=\"button\"\n class=\"ngx-record-editor__banner-dismiss\"\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\n (click)=\"dismissInfoBanner(banner.fieldId)\"\n >\u2715</button>\n </div>\n }\n\n <!-- Modification baseline banner -->\n @if (isModified()) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\n </div>\n }\n\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\n @if (summaryFields().length > 0) {\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\n @for (sf of summaryFields(); track sf.id) {\n <div\n class=\"ngx-record-editor__summary-item\"\n [attr.data-testid]=\"'summary-' + sf.id\"\n (click)=\"jumpToField(sf.id)\"\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\n >\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\n @if (viewMode && !recordReadOnly) {\n <div class=\"ngx-record-editor__section-bar\">\n @if (isEditingActiveTab) {\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\n Cancel\n </button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\n Save section\n </button>\n } @else {\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\n Edit section\n </button>\n }\n </div>\n }\n\n @if (Object.keys(sectionErrors()).length > 0) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\n @for (key of Object.keys(sectionErrors()); track key) {\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\n }\n </div>\n }\n\n <!-- Array rows: listed here, edited in the drawer below -->\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\n <div class=\"ngx-record-editor__rows-head\">\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\n @if (!sectionReadOnly) {\n <button\n type=\"button\"\n class=\"ngx-form__reset\"\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\n (click)=\"openAddRow(arrayField)\"\n >+ Row</button>\n }\n </div>\n\n @for (row of rowsOf(arrayField); track $index) {\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\n @if (!sectionReadOnly) {\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\n }\n </div>\n } @empty {\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\n }\n </div>\n }\n\n <!--\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\n tab view races the tab's own initialisation (the reference hit this with FormArray).\n -->\n @if (inlineRowField(); as rowField) {\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\n <div class=\"ngx-record-editor__rows-head\">\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\n </div>\n\n <div class=\"ngx-form__panel\">\n @for (child of rowField.children ?? []; track child.id) {\n <ngx-dynamic-field\n [field]=\"child\"\n [control]=\"inlineRowForm!.get(child.id)!\"\n [config]=\"config\"\n [language]=\"language\"\n [readonly]=\"false\"\n [userRoles]=\"userRoles\"\n [style.gridColumn]=\"'span 12'\"\n />\n }\n </div>\n\n <div class=\"ngx-record-editor__section-bar\">\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\n </div>\n </div>\n }\n\n <!-- Main Dynamic Form -->\n <ngx-dynamic-form\n [config]=\"config\"\n [rules]=\"rules\"\n [initialData]=\"initialData\"\n [originalData]=\"originalBaseline()\"\n [userRoles]=\"userRoles\"\n [language]=\"language\"\n [readonly]=\"sectionReadOnly\"\n [readOnlyFields]=\"readOnlyFields\"\n [showInfoBanners]=\"false\"\n [loading]=\"loading\"\n [error]=\"error\"\n (formChange)=\"onFormChange($event)\"\n (formSubmit)=\"onFormSubmit($event)\"\n (formReset)=\"onFormReset()\"\n (activeTabChange)=\"onActiveTabChange($event)\"\n />\n</div>\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicFormComponent, selector: "ngx-dynamic-form", inputs: ["config", "rules", "initialData", "originalData", "userRoles", "language", "readonly", "readOnlyFields", "showInfoBanners", "loading", "error", "changeDebounceMs", "preview"], outputs: ["formSubmit", "formChange", "formReset", "activeTabChange"] }, { kind: "component", type: DynamicFieldComponent, selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }] });
455
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DynamicRecordFormComponent, isStandalone: true, selector: "ngx-dynamic-record-form", inputs: { config: "config", rules: "rules", initialData: "initialData", userRoles: "userRoles", language: "language", readonly: "readonly", loading: "loading", error: "error", isReadOnly: "isReadOnly", readOnlyFields: "readOnlyFields", viewMode: "viewMode" }, outputs: { formSubmit: "formSubmit", formChange: "formChange", formReset: "formReset", sectionSave: "sectionSave" }, viewQueries: [{ propertyName: "dynamicFormComp", first: true, predicate: DynamicFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-record-editor\">\n <!-- Record Header -->\n <div class=\"ngx-record-editor__header\">\n <div class=\"ngx-record-editor__title-group\">\n @if (profileImageUrl) {\n <img\n class=\"ngx-record-editor__avatar\"\n data-testid=\"header-profile-image\"\n [src]=\"profileImageUrl\"\n [alt]=\"recordTitle\"\n />\n } @else {\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\n {{ avatarLetter }}\n </div>\n }\n <div>\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\n {{ recordTitle }}\n </h2>\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\n </div>\n </div>\n\n <!-- Record-level status switch, outside section editing -->\n @if (headerToggleField; as toggleField) {\n <label class=\"ngx-record-editor__header-toggle\">\n <span>{{ formatFieldLabel(toggleField) }}</span>\n <input\n type=\"checkbox\"\n role=\"switch\"\n data-testid=\"header-toggle\"\n [checked]=\"headerToggleValue\"\n [disabled]=\"recordReadOnly\"\n [attr.aria-checked]=\"headerToggleValue\"\n (change)=\"toggleHeaderStatus()\"\n />\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\n </label>\n }\n </div>\n\n <!-- Dismissible info banners (rules `info` action) -->\n @for (banner of infoBanners; track banner.fieldId) {\n <div\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\n role=\"status\"\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\n >\n <span>\u2139\uFE0F {{ banner.message }}</span>\n <button\n type=\"button\"\n class=\"ngx-record-editor__banner-dismiss\"\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\n (click)=\"dismissInfoBanner(banner.fieldId)\"\n >\u2715</button>\n </div>\n }\n\n <!-- Modification baseline banner -->\n @if (isModified()) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\n </div>\n }\n\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\n @if (summaryFields().length > 0) {\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\n @for (sf of summaryFields(); track sf.id) {\n <div\n class=\"ngx-record-editor__summary-item\"\n [attr.data-testid]=\"'summary-' + sf.id\"\n (click)=\"jumpToField(sf.id)\"\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\n >\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\n @if (viewMode && !recordReadOnly) {\n <div class=\"ngx-record-editor__section-bar\">\n @if (isEditingActiveTab) {\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\n Cancel\n </button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\n Save section\n </button>\n } @else {\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\n Edit section\n </button>\n }\n </div>\n }\n\n @if (Object.keys(sectionErrors()).length > 0) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\n @for (key of Object.keys(sectionErrors()); track key) {\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\n }\n </div>\n }\n\n <!-- Array rows: listed here, edited in the drawer below -->\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\n <div class=\"ngx-record-editor__rows-head\">\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\n @if (!sectionReadOnly) {\n <button\n type=\"button\"\n class=\"ngx-form__reset\"\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\n (click)=\"openAddRow(arrayField)\"\n >+ Row</button>\n }\n </div>\n\n @for (row of rowsOf(arrayField); track $index) {\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\n @if (!sectionReadOnly) {\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\n }\n </div>\n } @empty {\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\n }\n </div>\n }\n\n <!--\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\n tab view races the tab's own initialisation (the reference hit this with FormArray).\n -->\n @if (inlineRowField(); as rowField) {\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\n <div class=\"ngx-record-editor__rows-head\">\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\n </div>\n\n <div class=\"ngx-form__panel\">\n @for (child of rowField.children ?? []; track child.id) {\n <ngx-dynamic-field\n [field]=\"child\"\n [control]=\"inlineRowForm!.get(child.id)!\"\n [config]=\"config\"\n [language]=\"language\"\n [readonly]=\"false\"\n [userRoles]=\"userRoles\"\n [style.gridColumn]=\"'span 12'\"\n />\n }\n </div>\n\n <div class=\"ngx-record-editor__section-bar\">\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\n </div>\n </div>\n }\n\n <!-- Main Dynamic Form -->\n <ngx-dynamic-form\n [config]=\"config\"\n [rules]=\"rules\"\n [initialData]=\"initialData\"\n [originalData]=\"originalBaseline()\"\n [userRoles]=\"userRoles\"\n [language]=\"language\"\n [readonly]=\"sectionReadOnly\"\n [readOnlyFields]=\"readOnlyFields\"\n [showInfoBanners]=\"false\"\n [loading]=\"loading\"\n [error]=\"error\"\n (formChange)=\"onFormChange($event)\"\n (formSubmit)=\"onFormSubmit($event)\"\n (formReset)=\"onFormReset()\"\n (activeTabChange)=\"onActiveTabChange($event)\"\n />\n</div>\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicFormComponent, selector: "ngx-dynamic-form", inputs: ["config", "rules", "initialData", "originalData", "userRoles", "language", "readonly", "readOnlyFields", "showInfoBanners", "loading", "error", "changeDebounceMs", "preview"], outputs: ["formSubmit", "formChange", "formReset", "activeTabChange", "saveRejected"] }, { kind: "component", type: DynamicFieldComponent, selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }] });
456
456
  }
457
457
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicRecordFormComponent, decorators: [{
458
458
  type: Component,
@@ -491,4 +491,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
491
491
  type: ViewChild,
492
492
  args: [DynamicFormComponent]
493
493
  }] } });
494
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUE4QixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7QUFFOUU7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFbEQ7Ozs7R0FJRztBQW9NSCxNQUFNLE9BQU8sMEJBQTBCO0lBQzVCLE1BQU0sQ0FBb0I7SUFDMUIsS0FBSyxDQUFjO0lBQ25CLFdBQVcsQ0FBdUI7SUFDbEMsU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixLQUFLLEdBQWtCLElBQUksQ0FBQztJQUNyQyw4RkFBOEY7SUFDckYsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUNyQyx1RkFBdUY7SUFDOUUsY0FBYyxHQUFhLEVBQUUsQ0FBQztJQUN2Qzs7Ozs7O09BTUc7SUFDTSxRQUFRLEdBQVksSUFBSSxDQUFDO0lBRXhCLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztJQUNyRCxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7SUFDckQsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDL0Msc0ZBQXNGO0lBQzVFLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBa0QsQ0FBQztJQUUxRCxlQUFlLENBQXdCO0lBRXZELGVBQWUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUV6RCxXQUFXLEdBQUcsTUFBTSxDQUFzQixFQUFFLENBQUMsQ0FBQztJQUM5QyxnQkFBZ0IsR0FBRyxNQUFNLENBQXNCLEVBQUUsQ0FBQyxDQUFDO0lBRTVEOzs7Ozs7T0FNRztJQUNjLFNBQVMsR0FBRyxNQUFNLENBQXNCLElBQUksR0FBRyxFQUFVLENBQUMsQ0FBQztJQUU1RTs7Ozs7O09BTUc7SUFDSCxJQUFJLFdBQVc7UUFDYixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7YUFDN0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELGlCQUFpQixDQUFDLE9BQWU7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDMUMsQ0FBQztJQUVELCtFQUErRTtJQUUvRTs7Ozs7O09BTUc7SUFDTSxjQUFjLEdBQUcsTUFBTSxDQUEyQixJQUFJLENBQUMsQ0FBQztJQUN4RCxjQUFjLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUN0RCxhQUFhLEdBQXFCLElBQUksQ0FBQztJQUV2QyxzRkFBc0Y7SUFDdEYsSUFBSSx1QkFBdUI7UUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdELE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxLQUF3QjtRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEYsTUFBTSxJQUFJLEdBQUksT0FBMEMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQWtDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN4RSxDQUFDO0lBRUQsb0ZBQW9GO0lBQ3BGLFVBQVUsQ0FBQyxLQUF3QixFQUFFLEdBQTRCO1FBQy9ELE1BQU0sS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDeEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQzthQUNqQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ3RELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RELENBQUM7SUFFRCxVQUFVLENBQUMsS0FBd0I7UUFDakMsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU87UUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQWMsQ0FBQztJQUNoRixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQXdCLEVBQUUsS0FBYTtRQUNqRCxJQUFJLElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTztRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFjLENBQUM7SUFDM0csQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQsOEZBQThGO0lBQzlGLE9BQU87UUFDTCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPO1FBRW5ELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BDLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7WUFDaEYsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxRCxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUF3QixFQUFFLEtBQWE7UUFDL0MsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU87UUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQzdGLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsS0FBSyxFQUFFLHNCQUFzQixFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNyRixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxLQUFLO1lBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRCwrRUFBK0U7SUFFL0U7Ozs7OztPQU1HO0lBQ00sWUFBWSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFcEQ7Ozs7Ozs7T0FPRztJQUNjLGNBQWMsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRTlELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLEtBQUs7WUFBRSxPQUFPO1FBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELDBGQUEwRjtJQUNsRixpQkFBaUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUM7SUFDMUUsQ0FBQztJQUVELHNEQUFzRDtJQUM3QyxhQUFhLEdBQUcsTUFBTSxDQUF5QixFQUFFLENBQUMsQ0FBQztJQUU1RCxvRUFBb0U7SUFDakQsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUVuQyxJQUFJLGtCQUFrQjtRQUNwQix1RkFBdUY7UUFDdkYsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN4RSxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDekQsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQ3ZFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsb0ZBQW9GO0lBQ3BGLGFBQWE7UUFDWCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNsQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQTRCLENBQUM7WUFDL0csS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUU1QyxxRkFBcUY7Z0JBQ3JGLG9FQUFvRTtnQkFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNWLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQ3BFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDOUMsQ0FBQztvQkFDRCxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztvQkFDL0IsU0FBUztnQkFDWCxDQUFDO2dCQUVELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDbEMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBRTVCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO1FBRTFDLEtBQUssTUFBTSxLQUFLLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQy9FLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7YUFDakcsZ0JBQWdCLENBQUM7UUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFbEMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUNsRCxrRUFBa0U7WUFDbEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQVUsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBRUQsK0VBQStFO0lBRS9FLCtDQUErQztJQUN2QyxTQUFTO1FBQ2YsTUFBTSxHQUFHLEdBQXdCLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQXVDLEVBQUUsRUFBRTtZQUM3RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDWixVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQW1DLEVBQUUsRUFBRTtZQUN2RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDM0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckIsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDOUQsQ0FBQztJQUVELHFGQUFxRjtJQUNyRixJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzlELENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsSUFBSSxlQUFlO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBNEIsQ0FBQztRQUNuRSxPQUFPLEtBQUssRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDckMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzVELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELHlGQUF5RjtJQUNqRixVQUFVLENBQUMsT0FBZTtRQUNoQyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxVQUFVLENBQUMsT0FBZTtRQUNoQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQTBCLEVBQUUsRUFBVyxFQUFFO1lBQ3RELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFtQyxDQUFDO2dCQUNuRyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSTtvQkFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2xDLElBQUksS0FBSyxLQUFLLGVBQWU7d0JBQUUsT0FBTyxLQUFLLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxlQUFlLENBQUM7UUFDekIsQ0FBQyxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsT0FBTyxNQUFNLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6RCxDQUFDO0lBRVEsVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ25FLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBRU0sYUFBYSxHQUFHLFFBQVEsQ0FBc0IsR0FBRyxFQUFFO1FBQzFELE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUEwQixFQUFFLEVBQUUsRUFBRTtZQUNoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNyQixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQy9CLElBQUksQ0FBQyxDQUFDLGNBQWM7d0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztnQkFDRCxJQUFJLENBQUMsQ0FBQyxRQUFRO29CQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsWUFBWSxDQUFDLElBQXlCO1FBQ3BDLG1GQUFtRjtRQUNuRiwwRkFBMEY7UUFDMUYsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBeUI7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUF3QjtRQUN2QyxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLGdCQUFnQixDQUFDLEtBQXdCO1FBQ3ZDLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQWU7UUFDekIsNEJBQTRCO1FBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDMUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUM7WUFDaEUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsT0FBTyxFQUFFLENBQUMsQ0FBQztvQkFDakUsSUFBSSxFQUFFLEVBQUUsQ0FBQzt3QkFDUCxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQzt3QkFDM0QsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNiLENBQUM7Z0JBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNQLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7d0dBMWRVLDBCQUEwQjs0RkFBMUIsMEJBQTBCLDZmQTRCMUIsb0JBQW9CLHFFQzlQakMsdWhQQWtNQSwwa0dEaEtZLFlBQVksOEJBQUUsbUJBQW1CLDRVQUFFLG9CQUFvQiw2VEFBRSxxQkFBcUI7OzRGQWdNN0UsMEJBQTBCO2tCQW5NdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDOzhCQWlNaEYsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQVFHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFMEIsZUFBZTtzQkFBL0MsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eUZvcm1Db25maWcsIEZvcm1SdWxlLCBOZXN0ZWRGaWVsZENvbmZpZywgTmVzdGVkVGFiQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgZmluZFRhYiwgZm9ybWF0RGlzcGxheVZhbHVlLCBnZXRUYWJEYXRhLCByZXNvbHZlTGFiZWwgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQvZHluYW1pYy1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnVsZXNFdmFsdWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3J1bGVzLWV2YWx1YXRpb24uc2VydmljZSc7XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBcIm5vIHRhYiBob2xkcyB0aGlzIGZpZWxkXCIgZnJvbSBcInRoZSBmaWVsZCBob2xkcyB1bmRlZmluZWRcIiwgc28gdGhlIHRhYiB3YWxrXG4gKiBjYW4ga2VlcCBzZWFyY2hpbmcgaW4gdGhlIGZpcnN0IGNhc2UgYW5kIHN0b3AgaW4gdGhlIHNlY29uZC5cbiAqL1xuY29uc3QgRklFTERfTk9UX0ZPVU5EID0gU3ltYm9sKCdmaWVsZC1ub3QtZm91bmQnKTtcblxuLyoqXG4gKiBEeW5hbWljUmVjb3JkRm9ybUNvbXBvbmVudCDigJQgY29tcHJlaGVuc2l2ZSB0YWJiZWQgcmVjb3JkIHZpZXcgJiBlZGl0IGNvbXBvbmVudC5cbiAqIFN1cHBvcnRzIGNyb3NzLXRhYiBydWxlIGV2YWx1YXRpb24sIHByb2ZpbGUgaGVhZGVyLCBzdW1tYXJ5IGRyYXdlciAoc2hvd09uTWluaW1pemUpLFxuICogaW50ZXJhY3RpdmUgcXVpY2stanVtcCBsaW5rcywgYW5kIGJhc2VsaW5lIG1vZGlmaWNhdGlvbiB0cmFja2luZy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWR5bmFtaWMtcmVjb3JkLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBEeW5hbWljRm9ybUNvbXBvbmVudCwgRHluYW1pY0ZpZWxkQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtcmVjb3JkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubmd4LXJlY29yZC1lZGl0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjNmNGY2O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX190aXRsZS1ncm91cCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyIHtcbiAgICAgICAgd2lkdGg6IDQ4cHg7XG4gICAgICAgIGhlaWdodDogNDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2UwZTdmZjtcbiAgICAgICAgY29sb3I6ICM0ZjQ2ZTU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdWJ0aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgY29sb3I6ICM2YjcyODA7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBjb2xvcjogIzM3NDE1MTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZS10ZXh0IHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyIHtcbiAgICAgICAgcGFkZGluZzogMTBweCAxNHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcbiAgICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzcyB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzczpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci0tZXJyb3Ige1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVjYWNhO1xuICAgICAgICBjb2xvcjogI2I5MWMxYztcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1iYXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1oaW50IHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLXdhcm5pbmcge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVmM2M3O1xuICAgICAgICBjb2xvcjogI2I0NTMwOTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93cyB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LXRleHQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19yb3ctYnRuIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWVtcHR5IHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogIzZiNzI4MDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19kcmF3ZXIge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGJlYWZlO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDE0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbCB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE4MHB4LCAxZnIpKTtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWl0ZW0ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktaXRlbTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktbGFiZWwge1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LXZhbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY29sb3I6ICMxZjI5Mzc7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1JlY29yZEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBFbnRpdHlGb3JtQ29uZmlnO1xuICBASW5wdXQoKSBydWxlcz86IEZvcm1SdWxlW107XG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgQElucHV0KCkgdXNlclJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaG9sZSByZWNvcmQgcmVhZC1vbmx5LCByZWdhcmRsZXNzIG9mIFJCQUMuIEVxdWl2YWxlbnQgdG8gdGhlIHJlZmVyZW5jZSdzIGBpc1JlYWRPbmx5YC4gKi9cbiAgQElucHV0KCkgaXNSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU3BlY2lmaWMgZmllbGQgaWRzIGZvcmNlZCByZWFkLW9ubHkgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIHJlY29yZCBzdGF5cyBlZGl0YWJsZS4gKi9cbiAgQElucHV0KCkgcmVhZE9ubHlGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIC8qKlxuICAgKiBPcGVuIHRoZSByZWNvcmQgcmVhZC1vbmx5LCB3aXRoIGEgcGVyLXRhYiBcIkVkaXQgc2VjdGlvblwiIGZsb3cg4oCUIG9uZSB0YWIgaXMgZWRpdGVkIGFuZFxuICAgKiB2YWxpZGF0ZWQgYXQgYSB0aW1lLiBUaGlzIGlzIHRoZSBmcmFtZXdvcmsncyBgRW50aXR5UmVjb3JkQ29tcG9uZW50YCBtb2RlbCBhbmQgdGhlXG4gICAqIGRlZmF1bHQgaGVyZS5cbiAgICpcbiAgICogU2V0IGZhbHNlIGZvciBhIGRpcmVjdGx5IGVkaXRhYmxlIHJlY29yZCB3aXRoIG5vIHZpZXcvZWRpdCBkaXN0aW5jdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIHZpZXdNb2RlOiBib29sZWFuID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj4oKTtcbiAgQE91dHB1dCgpIGZvcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZDxzdHJpbmcsIGFueT4+KCk7XG4gIEBPdXRwdXQoKSBmb3JtUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBPbmUgdGFiIHNlY3Rpb24gd2FzIHNhdmVkLiBDYXJyaWVzIHRoZSB3aG9sZSByZWNvcmQsIHBsdXMgd2hpY2ggdGFiIHdhcyBlZGl0ZWQuICovXG4gIEBPdXRwdXQoKSBzZWN0aW9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyB0YWJJZDogc3RyaW5nOyByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfT4oKTtcblxuICBAVmlld0NoaWxkKER5bmFtaWNGb3JtQ29tcG9uZW50KSBkeW5hbWljRm9ybUNvbXA/OiBEeW5hbWljRm9ybUNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJ1bGVzRXZhbHVhdGlvbiA9IGluamVjdChSdWxlc0V2YWx1YXRpb25TZXJ2aWNlKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0YSA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IG9yaWdpbmFsQmFzZWxpbmUgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgYW55Pj4oe30pO1xuXG4gIC8qKlxuICAgKiBJbmZvIGJhbm5lcnMgdGhlIHVzZXIgaGFzIGRpc21pc3NlZCwgYnkgZmllbGQgaWQuXG4gICAqXG4gICAqIFRoZSByZWZlcmVuY2UncyBjb250cmFjdDogYW4gaW5mbyBiYW5uZXIgcGVyc2lzdHMgdW50aWwgZGlzbWlzc2VkLCAqKm5vdCoqIHVudGlsIHRoZVxuICAgKiB2YWx1ZSBjaGFuZ2VzLiBEaXNtaXNzYWwgaXMga2V5ZWQgYnkgZmllbGQgc28gcmUtdHJpZ2dlcmluZyBhIGRpZmZlcmVudCBmaWVsZCdzIHJ1bGVcbiAgICogc3RpbGwgc2hvd3MuIFJlLWFybWVkIHdoZW4gYSBkaWZmZXJlbnQgcmVjb3JkIGlzIGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzbWlzc2VkID0gc2lnbmFsPFJlYWRvbmx5U2V0PHN0cmluZz4+KG5ldyBTZXQ8c3RyaW5nPigpKTtcblxuICAvKipcbiAgICogSW5mbyBiYW5uZXJzIGZyb20gdGhlIHJ1bGVzIGVuZ2luZSB0aGF0IGFyZSBzdGlsbCBzaG93aW5nLlxuICAgKlxuICAgKiBBIGdldHRlciwgbm90IGEgYGNvbXB1dGVkYDogdGhlIHNvdXJjZSBpcyBgZHluYW1pY0Zvcm1Db21wYCwgYSBWaWV3Q2hpbGQuIEEgY29tcHV0ZWRcbiAgICogZXZhbHVhdGVkIGJlZm9yZSB0aGUgdmlldyBpbml0aWFsaXNlcyB3b3VsZCBjYXB0dXJlIG5vIGRlcGVuZGVuY3kgb24gdGhlIGNoaWxkJ3NcbiAgICogYHJ1bGVSZXN1bHRgIHNpZ25hbCBhbmQgdGhlbiBuZXZlciByZWNvbXB1dGUuIFJlYWQgcGVyIGNoYW5nZS1kZXRlY3Rpb24gcGFzcyBpbnN0ZWFkLlxuICAgKi9cbiAgZ2V0IGluZm9CYW5uZXJzKCk6IHsgZmllbGRJZDogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8ucnVsZVJlc3VsdCgpO1xuICAgIGNvbnN0IGdvbmUgPSB0aGlzLmRpc21pc3NlZCgpO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQ/LmluZm9CYW5uZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW2ZpZWxkSWRdKSA9PiAhZ29uZS5oYXMoZmllbGRJZCkpXG4gICAgICAubWFwKChbZmllbGRJZCwgbWVzc2FnZV0pID0+ICh7IGZpZWxkSWQsIG1lc3NhZ2U6IFN0cmluZyhtZXNzYWdlKSB9KSk7XG4gIH1cblxuICBkaXNtaXNzSW5mb0Jhbm5lcihmaWVsZElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3NlZC5zZXQobmV3IFNldCh0aGlzLmRpc21pc3NlZCgpKS5hZGQoZmllbGRJZCkpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBub3RoaW5nIGluIHRoZSByZWNvcmQgbWF5IGJlIGVkaXRlZC4gKi9cbiAgZ2V0IHJlY29yZFJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuaXNSZWFkT25seTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbmxpbmUgYXJyYXktcm93IGVkaXRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEEgcm93IG9mIGFuIGBhcnJheWAgZmllbGQgaXMgZWRpdGVkIGluIGEgZHJhd2VyLCBub3QgaW5saW5lIGluIHRoZSB0YWIgcGFuZWwuXG4gICAqXG4gICAqIFRoZSBkcmF3ZXIgaXMgcmVuZGVyZWQgb3V0c2lkZSB0aGUgdGFiIGNvbnRhaW5lciBvbiBwdXJwb3NlOiB0aGUgcmVmZXJlbmNlIGZvdW5kIHRoYXRcbiAgICogYnVpbGRpbmcgYSByb3cncyBGb3JtR3JvdXAgaW5zaWRlIHRoZSB0YWIgdmlldyByYWNlcyB0aGUgdGFiJ3Mgb3duIGluaXRpYWxpc2F0aW9uLCBzb1xuICAgKiB0aGUgcm93IGZvcm0gaXMga2VwdCBkZXRhY2hlZCBhbmQgb25seSBwdXNoZWQgaW50byB0aGUgRm9ybUFycmF5IG9uIHNhdmUuXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVSb3dGaWVsZCA9IHNpZ25hbDxOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBpbmxpbmVSb3dJbmRleCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgaW5saW5lUm93Rm9ybTogRm9ybUdyb3VwIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIGBhcnJheWAgZmllbGRzIG9uIHRoZSB0YWIgY3VycmVudGx5IHNob3duLCBzbyB0aGUgdGVtcGxhdGUgY2FuIGxpc3QgdGhlaXIgcm93cy4gKi9cbiAgZ2V0IGFycmF5RmllbGRzRm9yQWN0aXZlVGFiKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5hY3RpdmVUYWJJZDtcbiAgICBjb25zdCB0YWIgPSB0YWJJZCA/IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKSA6IG51bGw7XG4gICAgcmV0dXJuICh0YWI/LmZpZWxkcyA/PyBbXSkuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnYXJyYXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3dzIGN1cnJlbnRseSBoZWxkIGJ5IGFuIGBhcnJheWAgZmllbGQsIHJlYWQgZnJvbSB0aGUgcmVjb3JkIHZhbHVlLlxuICAgKlxuICAgKiBEZWxpYmVyYXRlbHkgbm90IHJlYWQgb2ZmIHRoZSBjaGlsZCdzIEZvcm1BcnJheTogdGhhdCBjb250cm9sIG9ubHkgZXhpc3RzIG9uY2UgdGhlXG4gICAqIGNoaWxkIGhhcyBpbml0aWFsaXNlZCwgc28gcmVuZGVyaW5nIGZyb20gaXQgY2hhbmdlZCB2YWx1ZSBtaWQtcGFzcy4gYGN1cnJlbnREYXRhYCBpcyBhXG4gICAqIHNpZ25hbCBzZWVkZWQgZnJvbSBgaW5pdGlhbERhdGFgIGFuZCBrZXB0IGN1cnJlbnQgYnkgdGhlIGNoaWxkJ3MgYGZvcm1DaGFuZ2VgLlxuICAgKi9cbiAgcm93c09mKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10ge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5hY3RpdmVUYWJJZDtcbiAgICBjb25zdCB0YWJEYXRhID0gdGFiSWQgPyBnZXRUYWJEYXRhKHRhYklkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSA6IG51bGw7XG4gICAgY29uc3Qgcm93cyA9ICh0YWJEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LltmaWVsZC5pZF07XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocm93cykgPyAocm93cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA6IFtdO1xuICB9XG5cbiAgLyoqIE9uZSByb3cgcmVuZGVyZWQgYXMgdGV4dCwgc28gdGhlIGxpc3QgaXMgcmVhZGFibGUgd2l0aG91dCBvcGVuaW5nIHRoZSBkcmF3ZXIuICovXG4gIHJvd1N1bW1hcnkoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvdyA/PyB7fTtcbiAgICBjb25zdCBwYXJ0cyA9IChmaWVsZC5jaGlsZHJlbiA/PyBbXSlcbiAgICAgIC5tYXAoY2hpbGQgPT4gdmFsdWVbY2hpbGQuaWRdKVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwgJiYgdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09ICcnKVxuICAgICAgLm1hcCh2ID0+ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2KSA6IFN0cmluZyh2KSkpO1xuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPyBwYXJ0cy5qb2luKCcgwrcgJykgOiAnKGVtcHR5KSc7XG4gIH1cblxuICBvcGVuQWRkUm93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChudWxsKTtcbiAgICB0aGlzLmlubGluZVJvd0Zvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uY3JlYXRlQXJyYXlSb3coZmllbGQpIGFzIEZvcm1Hcm91cDtcbiAgfVxuXG4gIG9wZW5FZGl0Um93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChpbmRleCk7XG4gICAgdGhpcy5pbmxpbmVSb3dGb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA/LmNyZWF0ZUFycmF5Um93KGZpZWxkLCB0aGlzLnJvd3NPZihmaWVsZClbaW5kZXhdKSBhcyBGb3JtR3JvdXA7XG4gIH1cblxuICBjYW5jZWxSb3coKTogdm9pZCB7XG4gICAgdGhpcy5pbmxpbmVSb3dGaWVsZC5zZXQobnVsbCk7XG4gICAgdGhpcy5pbmxpbmVSb3dJbmRleC5zZXQobnVsbCk7XG4gICAgdGhpcy5pbmxpbmVSb3dGb3JtID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBDb21taXQgdGhlIGRyYXdlciBpbnRvIHRoZSBGb3JtQXJyYXkuIFJ1bGVzIHJlLWV2YWx1YXRlIG9mZiB0aGUgcmVzdWx0aW5nIHZhbHVlIGNoYW5nZS4gKi9cbiAgc2F2ZVJvdygpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaW5saW5lUm93RmllbGQoKTtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA7XG4gICAgaWYgKCFmaWVsZCB8fCAhZm9ybSB8fCAhdGhpcy5pbmxpbmVSb3dGb3JtKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5pbmxpbmVSb3dGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuaW5saW5lUm93Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXkgPSBmb3JtLmdldEFycmF5Q29udHJvbChmaWVsZC5pZCwgdGhpcy5hY3RpdmVUYWJJZCA/PyB1bmRlZmluZWQpO1xuICAgIGlmICghYXJyYXkpIHJldHVybjtcblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmxpbmVSb3dJbmRleCgpO1xuICAgIGlmIChpbmRleCA9PT0gbnVsbCkgYXJyYXkucHVzaChmb3JtLmNyZWF0ZUFycmF5Um93KGZpZWxkLCB0aGlzLmlubGluZVJvd0Zvcm0udmFsdWUpKTtcbiAgICBlbHNlIGFycmF5LmF0KGluZGV4KS5wYXRjaFZhbHVlKHRoaXMuaW5saW5lUm93Rm9ybS52YWx1ZSk7XG5cbiAgICBhcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoZm9ybS5leHRyYWN0UmVjb3JkKCkpO1xuICAgIHRoaXMuY2FuY2VsUm93KCk7XG4gIH1cblxuICBkZWxldGVSb3coZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VjdGlvblJlYWRPbmx5KSByZXR1cm47XG4gICAgY29uc3QgYXJyYXkgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uZ2V0QXJyYXlDb250cm9sKGZpZWxkLmlkLCB0aGlzLmFjdGl2ZVRhYklkID8/IHVuZGVmaW5lZCk7XG4gICAgYXJyYXk/LnJlbW92ZUF0KGluZGV4KTtcbiAgICBhcnJheT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcbiAgICBpZiAodGhpcy5pbmxpbmVSb3dJbmRleCgpID09PSBpbmRleCkgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQZXItdGFiIHNlY3Rpb24gZWRpdGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHRhYiBjdXJyZW50bHkgb3BlbiBmb3IgZWRpdGluZywgb3IgbnVsbCB3aGVuIHRoZSByZWNvcmQgaXMgYmVpbmcgdmlld2VkLlxuICAgKlxuICAgKiBUaGUgcmVmZXJlbmNlIGVkaXRzIG9uZSB0YWIgc2VjdGlvbiBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHJlY29yZCwgYW5kXG4gICAqIHZhbGlkYXRlcyBvbmx5IHRoYXQgc2VjdGlvbiBvbiBzYXZlIOKAlCBhIHJlcXVpcmVkIGZpZWxkIG9uIGFuIHVudG91Y2hlZCB0YWIgbXVzdCBub3RcbiAgICogYmxvY2sgc2F2aW5nIHRoZSB0YWIgeW91IGFyZSBhY3R1YWxseSB3b3JraW5nIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdGluZ1RhYklkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFiIHRoZSBpbm5lciBmb3JtIGlzIHNob3dpbmcuXG4gICAqXG4gICAqIFRyYWNrZWQgaGVyZSByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgVmlld0NoaWxkLiBUaGUgY2hpbGQgcmVzb2x2ZXMgaXRzIGZpcnN0IHRhYiBhc1xuICAgKiBwYXJ0IG9mIGl0cyBvd24gaW5pdGlhbGlzYXRpb24sIHNvIHJlYWRpbmcgaXQgZHVyaW5nIHRoaXMgY29tcG9uZW50J3MgcmVuZGVyIGNoYW5nZWRcbiAgICogdmFsdWUgbWlkLXBhc3Mg4oCUIGFuIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkIGVycm9yLiBTZWVkZWQgZnJvbSB0aGVcbiAgICogY29uZmlnIGFuZCBrZXB0IGluIHN0ZXAgYnkgdGhlIGNoaWxkJ3MgYGFjdGl2ZVRhYkNoYW5nZWAgb3V0cHV0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVUYWJJZFNpZyA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBnZXQgYWN0aXZlVGFiSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiSWRTaWcoKTtcbiAgfVxuXG4gIG9uQWN0aXZlVGFiQ2hhbmdlKHRhYklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVUYWJJZFNpZygpID09PSB0YWJJZCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlVGFiSWRTaWcuc2V0KHRhYklkKTtcbiAgICAvLyBFZGl0aW5nIGRvZXMgbm90IGZvbGxvdyB0aGUgdXNlciB0byBhbm90aGVyIHRhYi5cbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIC8qKiBGaXJzdCB0YWIgYSB1c2VyIGNhbiBzZWUsIHVzZWQgdG8gc2VlZCB0aGUgYWN0aXZlIHRhYiBiZWZvcmUgdGhlIGNoaWxkIHJlcG9ydHMgb25lLiAqL1xuICBwcml2YXRlIGZpcnN0VmlzaWJsZVRhYklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8udGFicz8uZmluZCh0ID0+IHQudmlzaWJpbGl0eSAhPT0gZmFsc2UpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEVycm9ycyBmcm9tIHRoZSBsYXN0IHNhdmUgYXR0ZW1wdCwgYnkgZmllbGQgaWQuICovXG4gIHJlYWRvbmx5IHNlY3Rpb25FcnJvcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuXG4gIC8qKiBUZW1wbGF0ZSBhY2Nlc3MgdG8gYE9iamVjdC5rZXlzYCBmb3IgaXRlcmF0aW5nIHRoZSBlcnJvciBtYXAuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBPYmplY3QgPSBPYmplY3Q7XG5cbiAgZ2V0IGlzRWRpdGluZ0FjdGl2ZVRhYigpOiBib29sZWFuIHtcbiAgICAvLyBXaXRob3V0IHZpZXcgbW9kZSB0aGVyZSBpcyBubyB2aWV3L2VkaXQgZGlzdGluY3Rpb24g4oCUIGV2ZXJ5dGhpbmcgaXMgYWx3YXlzIGVkaXRhYmxlLlxuICAgIGlmICghdGhpcy52aWV3TW9kZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdGhpcy5hY3RpdmVUYWJJZCAmJiB0aGlzLmVkaXRpbmdUYWJJZCgpID09PSB0aGlzLmFjdGl2ZVRhYklkO1xuICB9XG5cbiAgLyoqIEZpZWxkcyByZW5kZXIgcmVhZC1vbmx5IHVubGVzcyB0aGVpciBvd24gdGFiIGlzIHRoZSBvbmUgYmVpbmcgZWRpdGVkLiAqL1xuICBnZXQgc2VjdGlvblJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmlzRWRpdGluZ0FjdGl2ZVRhYjtcbiAgfVxuXG4gIGVkaXRTZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3TW9kZSB8fCB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmFjdGl2ZVRhYklkKSByZXR1cm47XG4gICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldCh7fSk7XG4gICAgdGhpcy5lZGl0aW5nVGFiSWQuc2V0KHRoaXMuYWN0aXZlVGFiSWQpO1xuICB9XG5cbiAgLyoqIERpc2NhcmQgdGhpcyBzZWN0aW9uJ3MgZWRpdHMsIHJlc3RvcmluZyBlYWNoIGZpZWxkIGZyb20gdGhlIHNlc3Npb24gYmFzZWxpbmUuICovXG4gIGNhbmNlbFNlY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdGFiSWQgPSB0aGlzLmVkaXRpbmdUYWJJZCgpO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcDtcbiAgICBpZiAodGFiSWQgJiYgZm9ybSkge1xuICAgICAgY29uc3QgdGFiID0gZmluZFRhYih0aGlzLmNvbmZpZz8udGFicywgdGFiSWQpO1xuICAgICAgY29uc3QgYmFzZWxpbmVUYWIgPSAoZ2V0VGFiRGF0YSh0YWJJZCwgdGhpcy5vcmlnaW5hbEJhc2VsaW5lKCksIHRoaXMuY29uZmlnKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRhYj8uZmllbGRzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGJhc2VsaW5lVmFsdWUgPSBiYXNlbGluZVRhYltmaWVsZC5pZF07XG5cbiAgICAgICAgLy8gQSBGb3JtQXJyYXkgY2Fubm90IGJlIHJlc3RvcmVkIHdpdGggc2V0VmFsdWUg4oCUIHRoYXQgZGVtYW5kcyBhIHZhbHVlIHNoYXBlZCBleGFjdGx5XG4gICAgICAgIC8vIGxpa2UgdGhlIGN1cnJlbnQgcm93cy4gUmVidWlsZCBpdCBmcm9tIHRoZSBiYXNlbGluZSByb3dzIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybS5nZXRBcnJheUNvbnRyb2woZmllbGQuaWQsIHRhYklkKTtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXkuY2xlYXIoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBBcnJheS5pc0FycmF5KGJhc2VsaW5lVmFsdWUpID8gYmFzZWxpbmVWYWx1ZSA6IFtdKSB7XG4gICAgICAgICAgICBhcnJheS5wdXNoKGZvcm0uY3JlYXRlQXJyYXlSb3coZmllbGQsIHJvdykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKT8uc2V0VmFsdWUoYmFzZWxpbmVWYWx1ZSA/PyBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudERhdGEuc2V0KGZvcm0uZXh0cmFjdFJlY29yZCgpKTtcbiAgICB9XG4gICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldCh7fSk7XG4gICAgdGhpcy5lZGl0aW5nVGFiSWQuc2V0KG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoaXMgc2VjdGlvbiBvbmx5LCB0aGVuIGVtaXQgaXQuIFZhbGlkYXRpb24gaXMgc2NvcGVkIHR3byB3YXlzOiBBbmd1bGFyXG4gICAqIHZhbGlkaXR5IG9mIHRoZSB0YWIncyBvd24gY29udHJvbHMsIGFuZCBydWxlcyBmaWx0ZXJlZCB0byB0aGlzIHRhYiDigJQgYSBydWxlIHRhcmdldGluZ1xuICAgKiBhIGhpZGRlbiB0YWIgbXVzdCBub3QgYmxvY2sgdGhlIHNhdmUgKHRoZSByZWZlcmVuY2UncyBPVjAtOTY4IGZpeCkuXG4gICAqL1xuICBzYXZlU2VjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJJZCA9IHRoaXMuZWRpdGluZ1RhYklkKCk7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wO1xuICAgIGlmICghdGFiSWQgfHwgIWZvcm0pIHJldHVybjtcblxuICAgIGNvbnN0IHRhYiA9IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKTtcbiAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGFiPy5maWVsZHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGN0cmwgPSBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKTtcbiAgICAgIGlmIChjdHJsPy5pbnZhbGlkKSB7XG4gICAgICAgIGN0cmwubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICBlcnJvcnNbZmllbGQuaWRdID0gYCR7cmVzb2x2ZUxhYmVsKGZpZWxkLmxhYmVsLCB0aGlzLmxhbmd1YWdlKX0gaXMgaW52YWxpZC5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlZCA9IHRoaXMucnVsZXNFdmFsdWF0aW9uLmZpbHRlckZvclRhYih0aGlzLnJ1bGVzLCB0YWJJZCwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IHJ1bGVFcnJvcnMgPSB0aGlzLnJ1bGVzRXZhbHVhdGlvbi5ldmFsdWF0ZShzY29wZWQsIGZvcm0uZm9ybVZhbHVlcygpLCB0aGlzLm9yaWdpbmFsQmFzZWxpbmUoKSlcbiAgICAgIC52YWxpZGF0aW9uRXJyb3JzO1xuICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCBydWxlRXJyb3JzKTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VjdGlvbkVycm9ycy5zZXQoZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG5cbiAgICBjb25zdCByZWNvcmQgPSBmb3JtLmV4dHJhY3RSZWNvcmQoKTtcbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChyZWNvcmQpO1xuICAgIHRoaXMuc2VjdGlvblNhdmUuZW1pdCh7IHRhYklkLCByZWNvcmQgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VlZCB0aGUgc2Vzc2lvbiBiYXNlbGluZSBmcm9tIHRoZSBsb2FkZWQgcmVjb3JkIHNvIGBWQUxVRV9DSEFOR0VEYCBydWxlcyBhbmQgdGhlXG4gICAqIG1vZGlmaWNhdGlvbiBiYW5uZXIgY29tcGFyZSBhZ2FpbnN0IHRoZSByZWNvcmQgYXMgaXQgd2FzIG9wZW5lZCDigJQgbm90IGFzIGl0IHdhc1xuICAgKiBhZnRlciB0aGUgZmlyc3Qga2V5c3Ryb2tlLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRGF0YSddIHx8IGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsQmFzZWxpbmUuc2V0KHsgLi4uKHRoaXMuaW5pdGlhbERhdGEgPz8ge30pIH0pO1xuICAgICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoeyAuLi4odGhpcy5pbml0aWFsRGF0YSA/PyB7fSkgfSk7XG4gICAgICB0aGlzLmFjdGl2ZVRhYklkU2lnLnNldCh0aGlzLmZpcnN0VmlzaWJsZVRhYklkKCkpO1xuICAgICAgLy8gQSBkaWZmZXJlbnQgcmVjb3JkIGlzIGEgZGlmZmVyZW50IHNldCBvZiBiYW5uZXJzIOKAlCByZS1hcm0gdGhlbS5cbiAgICAgIHRoaXMuZGlzbWlzc2VkLnNldChuZXcgU2V0PHN0cmluZz4oKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlY29yZFRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgcmV0dXJuICdSZWNvcmQnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5uYW1lID8gcmVzb2x2ZUxhYmVsKHRoaXMuY29uZmlnLm5hbWUsIHRoaXMubGFuZ3VhZ2UpIDogdGhpcy5jb25maWcuZW50aXR5O1xuICB9XG5cbiAgZ2V0IGF2YXRhckxldHRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5yZWNvcmRUaXRsZSB8fCAnUicpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEhlYWRlciBmaWVsZHMgKGlzUHJvZmlsZUltYWdlIC8gaXNIZWFkZXJUb2dnbGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFdmVyeSBmaWVsZCBpbiB0aGUgY29uZmlnLCBhdCBhbnkgZGVwdGguICovXG4gIHByaXZhdGUgYWxsRmllbGRzKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IG91dDogTmVzdGVkRmllbGRDb25maWdbXSA9IFtdO1xuICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzID8/IFtdKSB7XG4gICAgICAgIG91dC5wdXNoKGYpO1xuICAgICAgICB3YWxrRmllbGRzKGYuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0YWJzID8/IFtdKSB7XG4gICAgICAgIHdhbGtGaWVsZHModC5maWVsZHMpO1xuICAgICAgICB3YWxrVGFicyh0LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKHRoaXMuY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFRoZSBmaWVsZCBmbGFnZ2VkIGBpc1Byb2ZpbGVJbWFnZWAsIHJlbmRlcmVkIGFzIHRoZSByZWNvcmQgYXZhdGFyLiAqL1xuICBnZXQgaGVhZGVyUHJvZmlsZUZpZWxkKCk6IE5lc3RlZEZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWxsRmllbGRzKCkuZmluZChmID0+IGYuaXNQcm9maWxlSW1hZ2UpID8/IG51bGw7XG4gIH1cblxuICAvKiogVGhlIGZpZWxkIGZsYWdnZWQgYGlzSGVhZGVyVG9nZ2xlYCwgcmVuZGVyZWQgYXMgYSBzdGF0dXMgc3dpdGNoIGluIHRoZSBoZWFkZXIuICovXG4gIGdldCBoZWFkZXJUb2dnbGVGaWVsZCgpOiBOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFsbEZpZWxkcygpLmZpbmQoZiA9PiBmLmlzSGVhZGVyVG9nZ2xlKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEF2YXRhciBpbWFnZSBVUkwsIHdoZW4gdGhlIHByb2ZpbGUgZmllbGQgaG9sZHMgYSBwZXJzaXN0ZWQgRmlsZVJlZi4gKi9cbiAgZ2V0IHByb2ZpbGVJbWFnZVVybCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaGVhZGVyUHJvZmlsZUZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZFZhbHVlKGZpZWxkLmlkKSBhcyB7IHVybD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICByZXR1cm4gdmFsdWU/LnVybCA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGhlYWRlclRvZ2dsZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5oZWFkZXJUb2dnbGVGaWVsZDtcbiAgICByZXR1cm4gZmllbGQgPyB0aGlzLmZpZWxkVmFsdWUoZmllbGQuaWQpID09PSB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmxpcCB0aGUgaGVhZGVyIHRvZ2dsZS4gSXQgd3JpdGVzIHN0cmFpZ2h0IHRvIHRoZSBjb250cm9sIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2hcbiAgICogc2VjdGlvbiBlZGl0aW5nIOKAlCB0aGUgcmVmZXJlbmNlIHRyZWF0cyBpdCBhcyBhIHJlY29yZC1sZXZlbCBzdGF0dXMgc3dpdGNoLCBub3QgcGFydCBvZlxuICAgKiBhbnkgb25lIHRhYidzIHNlY3Rpb24uXG4gICAqL1xuICB0b2dnbGVIZWFkZXJTdGF0dXMoKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmhlYWRlclRvZ2dsZUZpZWxkO1xuICAgIGlmICghZmllbGQgfHwgdGhpcy5yZWNvcmRSZWFkT25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmNvbnRyb2xGb3IoZmllbGQuaWQpO1xuICAgIGlmICghY3RybCkgcmV0dXJuO1xuICAgIGN0cmwuc2V0VmFsdWUoIXRoaXMuaGVhZGVyVG9nZ2xlVmFsdWUpO1xuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcbiAgfVxuXG4gIC8qKiBMb2NhdGUgYSBmaWVsZCdzIGNvbnRyb2wgd2hlcmV2ZXIgaXQgbGl2ZXMsIHNpbmNlIGhlYWRlciBmaWVsZHMgbWF5IGJlIG9uIGFueSB0YWIuICovXG4gIHByaXZhdGUgY29udHJvbEZvcihmaWVsZElkOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRm9ybUNvbXA/LmdldENvbnRyb2woZmllbGRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZpZWxkJ3MgY3VycmVudCB2YWx1ZSwgcmVhZCBmcm9tIHRoZSByZWNvcmQgc28gaXQgaXMgc3RhYmxlIGR1cmluZyByZW5kZXIuXG4gICAqXG4gICAqIFJlc29sdmVkIHRocm91Z2ggYGdldFRhYkRhdGFgIHNvIGl0IGhvbm91cnMgZXhhY3RseSB0aGUgbmVzdGluZyBjb250cmFjdCB0aGUgZm9ybVxuICAgKiBwYXRjaGVzIHdpdGgg4oCUIGB7IHRhYklkOiB7IGZpZWxkSWQgfSB9YCwgb3IgdGhlIHJlY29yZCByb290IHdoZW4gdGhlIHRhYiBzZXRzXG4gICAqIGBmbGF0RGF0YWAuIFJlYWRpbmcgdGhlIHJlY29yZCBmbGF0IGluc3RlYWQgaXMgbm90IGEgc2hvcnRjdXQ6IGl0IG1ha2VzIHRoZSBzdW1tYXJ5XG4gICAqIGRpc3BsYXkgdmFsdWVzIHRoZSBmb3JtIG5ldmVyIGxvYWRlZCwgd2hpY2ggcmVhZHMgYXMgXCJ0aGUgZGF0YSBpcyB0aGVyZVwiIHdoaWxlIGV2ZXJ5XG4gICAqIGNvbnRyb2wgYmVoaW5kIGl0IGlzIGVtcHR5LlxuICAgKlxuICAgKiBXYWxrcyBzdWItdGFicyBhcyB3ZWxsOiBhIHN1bW1hcnksIGhlYWRlciwgb3IgcHJvZmlsZSBmaWVsZCBtYXkgc2l0IG9uIGFueSB0YWIgYXQgYW55XG4gICAqIGRlcHRoLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWVsZFZhbHVlKGZpZWxkSWQ6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHZpc2l0ID0gKHRhYnM6IE5lc3RlZFRhYkNvbmZpZ1tdID0gW10pOiB1bmtub3duID0+IHtcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRhYnMpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGdldFRhYkRhdGEodGFiLmlkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gICAgICAgIGlmIChkYXRhICYmIGZpZWxkSWQgaW4gZGF0YSkgcmV0dXJuIGRhdGFbZmllbGRJZF07XG4gICAgICAgIGlmICh0YWIuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHZpc2l0KHRhYi5jaGlsZHJlbik7XG4gICAgICAgICAgaWYgKGZvdW5kICE9PSBGSUVMRF9OT1RfRk9VTkQpIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIEZJRUxEX05PVF9GT1VORDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdmlzaXQodGhpcy5jb25maWc/LnRhYnMpO1xuICAgIHJldHVybiByZXN1bHQgPT09IEZJRUxEX05PVF9GT1VORCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuXG4gIHJlYWRvbmx5IGlzTW9kaWZpZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3JpZyA9IHRoaXMub3JpZ2luYWxCYXNlbGluZSgpO1xuICAgIGNvbnN0IGN1cnIgPSB0aGlzLmN1cnJlbnREYXRhKCk7XG4gICAgaWYgKCFvcmlnIHx8ICFjdXJyIHx8IE9iamVjdC5rZXlzKG9yaWcpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvcmlnKSAhPT0gSlNPTi5zdHJpbmdpZnkoY3Vycik7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN1bW1hcnlGaWVsZHMgPSBjb21wdXRlZDxOZXN0ZWRGaWVsZENvbmZpZ1tdPigoKSA9PiB7XG4gICAgY29uc3QgZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdID0gW107XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gPSBbXSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0IG9mIHRhYnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHQuZmllbGRzID8/IFtdKSB7XG4gICAgICAgICAgaWYgKGYuc2hvd09uTWluaW1pemUpIGZpZWxkcy5wdXNoKGYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0LmNoaWxkcmVuKSB3YWxrVGFicyh0LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKHRoaXMuY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9KTtcblxuICBvbkZvcm1DaGFuZ2UoZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIC8vIEJhc2VsaW5lIGlzIHNlZWRlZCBmcm9tIGBpbml0aWFsRGF0YWAgaW4gbmdPbkNoYW5nZXM7IG9ubHkgZmlsbCBpdCBoZXJlIHdoZW4gdGhlXG4gICAgLy8gcmVjb3JkIHdhcyBvcGVuZWQgZW1wdHkgKGNyZWF0ZSBmbG93KSwgc28gdGhlIGZpcnN0IGVtaXR0ZWQgc2hhcGUgYmVjb21lcyB0aGUgYmFzZWxpbmUuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3JpZ2luYWxCYXNlbGluZSgpKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub3JpZ2luYWxCYXNlbGluZS5zZXQoeyAuLi5kYXRhIH0pO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChkYXRhKTtcbiAgICB0aGlzLmZvcm1DaGFuZ2UuZW1pdChkYXRhKTtcbiAgfVxuXG4gIG9uRm9ybVN1Ym1pdChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoZGF0YSk7XG4gIH1cblxuICBvbkZvcm1SZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1SZXNldC5lbWl0KCk7XG4gIH1cblxuICBmb3JtYXRGaWVsZExhYmVsKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbChmaWVsZC5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICAvKiogU3VtbWFyeSB2YWx1ZXMgcmVuZGVyIHRocm91Z2ggdGhlIHNoYXJlZCBjb3JlIGZvcm1hdHRlciwgbm90IGEgbG9jYWwgc3RyaW5naWZpZXIuICovXG4gIGZvcm1hdEZpZWxkVmFsdWUoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0RGlzcGxheVZhbHVlKGZpZWxkLnR5cGUsIGZpZWxkLm9wdGlvbnMsIHRoaXMuZmllbGRWYWx1ZShmaWVsZC5pZCksIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAganVtcFRvRmllbGQoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRmluZCBwYXJlbnQgdGFiIGZvciBmaWVsZFxuICAgIGZvciAoY29uc3QgdGFiIG9mIHRoaXMuY29uZmlnPy50YWJzIHx8IFtdKSB7XG4gICAgICBjb25zdCBoYXNGaWVsZCA9ICh0YWIuZmllbGRzIHx8IFtdKS5zb21lKGYgPT4gZi5pZCA9PT0gZmllbGRJZCk7XG4gICAgICBpZiAoaGFzRmllbGQpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRm9ybUNvbXA/LnNldEFjdGl2ZVRhYih0YWIuaWQpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBmaWVsZC1jb250YWluZXItJHtmaWVsZElkfWApO1xuICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yXCI+XG4gIDwhLS0gUmVjb3JkIEhlYWRlciAtLT5cbiAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlLWdyb3VwXCI+XG4gICAgICBAaWYgKHByb2ZpbGVJbWFnZVVybCkge1xuICAgICAgICA8aW1nXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImhlYWRlci1wcm9maWxlLWltYWdlXCJcbiAgICAgICAgICBbc3JjXT1cInByb2ZpbGVJbWFnZVVybFwiXG4gICAgICAgICAgW2FsdF09XCJyZWNvcmRUaXRsZVwiXG4gICAgICAgIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19hdmF0YXJcIiBkYXRhLXRlc3RpZD1cImhlYWRlci1hdmF0YXItaW5pdGlhbFwiPlxuICAgICAgICAgIHt7IGF2YXRhckxldHRlciB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXY+XG4gICAgICAgIDxoMiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX190aXRsZVwiIGRhdGEtdGVzdGlkPVwicmVjb3JkLXRpdGxlXCI+XG4gICAgICAgICAge3sgcmVjb3JkVGl0bGUgfX1cbiAgICAgICAgPC9oMj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VidGl0bGVcIj5FbnRpdHk6IHt7IGNvbmZpZy5lbnRpdHkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmVjb3JkLWxldmVsIHN0YXR1cyBzd2l0Y2gsIG91dHNpZGUgc2VjdGlvbiBlZGl0aW5nIC0tPlxuICAgIEBpZiAoaGVhZGVyVG9nZ2xlRmllbGQ7IGFzIHRvZ2dsZUZpZWxkKSB7XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZVwiPlxuICAgICAgICA8c3Bhbj57eyBmb3JtYXRGaWVsZExhYmVsKHRvZ2dsZUZpZWxkKSB9fTwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICByb2xlPVwic3dpdGNoXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImhlYWRlci10b2dnbGVcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImhlYWRlclRvZ2dsZVZhbHVlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVjb3JkUmVhZE9ubHlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJoZWFkZXJUb2dnbGVWYWx1ZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVIZWFkZXJTdGF0dXMoKVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUtdGV4dFwiPnt7IGhlYWRlclRvZ2dsZVZhbHVlID8gJ1llcycgOiAnTm8nIH19PC9zcGFuPlxuICAgICAgPC9sYWJlbD5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gRGlzbWlzc2libGUgaW5mbyBiYW5uZXJzIChydWxlcyBgaW5mb2AgYWN0aW9uKSAtLT5cbiAgQGZvciAoYmFubmVyIG9mIGluZm9CYW5uZXJzOyB0cmFjayBiYW5uZXIuZmllbGRJZCkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvXCJcbiAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2luZm8tYmFubmVyLScgKyBiYW5uZXIuZmllbGRJZFwiXG4gICAgPlxuICAgICAgPHNwYW4+4oS577iPIHt7IGJhbm5lci5tZXNzYWdlIH19PC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLWRpc21pc3NcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZGlzbWlzcy0nICsgYmFubmVyLmZpZWxkSWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEaXNtaXNzOiAnICsgYmFubmVyLm1lc3NhZ2VcIlxuICAgICAgICAoY2xpY2spPVwiZGlzbWlzc0luZm9CYW5uZXIoYmFubmVyLmZpZWxkSWQpXCJcbiAgICAgID7inJU8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gTW9kaWZpY2F0aW9uIGJhc2VsaW5lIGJhbm5lciAtLT5cbiAgQGlmIChpc01vZGlmaWVkKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS13YXJuaW5nXCI+XG4gICAgICDwn5SSIFJlY29yZCBtb2RpZmllZCBmcm9tIHNlc3Npb24gYmFzZWxpbmUg4oCUIHVuc2F2ZWQgY2hhbmdlcyBwZW5kaW5nLlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBTdW1tYXJ5IFBhbmVsIChzaG93T25NaW5pbWl6ZSBmaWVsZHMgd2l0aCBpbnRlcmFjdGl2ZSBqdW1wKSAtLT5cbiAgQGlmIChzdW1tYXJ5RmllbGRzKCkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbFwiIGRhdGEtdGVzdGlkPVwic3VtbWFyeS1wYW5lbFwiPlxuICAgICAgQGZvciAoc2Ygb2Ygc3VtbWFyeUZpZWxkcygpOyB0cmFjayBzZi5pZCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1pdGVtXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInc3VtbWFyeS0nICsgc2YuaWRcIlxuICAgICAgICAgIChjbGljayk9XCJqdW1wVG9GaWVsZChzZi5pZClcIlxuICAgICAgICAgIFt0aXRsZV09XCInQ2xpY2sgdG8ganVtcCB0byAnICsgZm9ybWF0RmllbGRMYWJlbChzZilcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1sYWJlbFwiPnt7IGZvcm1hdEZpZWxkTGFiZWwoc2YpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktdmFsXCI+e3sgZm9ybWF0RmllbGRWYWx1ZShzZikgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBTZWN0aW9uIGVkaXQgYmFyOiBvbmUgdGFiIGlzIGVkaXRlZCBhdCBhIHRpbWUsIGFuZCB2YWxpZGF0ZWQgb24gaXRzIG93biAtLT5cbiAgQGlmICh2aWV3TW9kZSAmJiAhcmVjb3JkUmVhZE9ubHkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XG4gICAgICBAaWYgKGlzRWRpdGluZ0FjdGl2ZVRhYikge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWhpbnRcIj5FZGl0aW5nIHRoaXMgc2VjdGlvbjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIiBkYXRhLXRlc3RpZD1cImNhbmNlbC1zZWN0aW9uXCIgKGNsaWNrKT1cImNhbmNlbFNlY3Rpb24oKVwiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fc3VibWl0XCIgZGF0YS10ZXN0aWQ9XCJzYXZlLXNlY3Rpb25cIiAoY2xpY2spPVwic2F2ZVNlY3Rpb24oKVwiPlxuICAgICAgICAgIFNhdmUgc2VjdGlvblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1mb3JtX19yZXNldFwiIGRhdGEtdGVzdGlkPVwiZWRpdC1zZWN0aW9uXCIgKGNsaWNrKT1cImVkaXRTZWN0aW9uKClcIj5cbiAgICAgICAgICBFZGl0IHNlY3Rpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyIG5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLWVycm9yXCIgcm9sZT1cImFsZXJ0XCIgZGF0YS10ZXN0aWQ9XCJzZWN0aW9uLWVycm9yc1wiPlxuICAgICAgQGZvciAoa2V5IG9mIE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSk7IHRyYWNrIGtleSkge1xuICAgICAgICA8ZGl2PuKaoO+4jyB7eyBzZWN0aW9uRXJyb3JzKClba2V5XSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBBcnJheSByb3dzOiBsaXN0ZWQgaGVyZSwgZWRpdGVkIGluIHRoZSBkcmF3ZXIgYmVsb3cgLS0+XG4gIEBmb3IgKGFycmF5RmllbGQgb2YgYXJyYXlGaWVsZHNGb3JBY3RpdmVUYWI7IHRyYWNrIGFycmF5RmllbGQuaWQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvd3NcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCIncm93cy0nICsgYXJyYXlGaWVsZC5pZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3dzLWhlYWRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1sYWJlbFwiPnt7IGZvcm1hdEZpZWxkTGFiZWwoYXJyYXlGaWVsZCkgfX08L3NwYW4+XG4gICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2FkZC1yb3ctJyArIGFycmF5RmllbGQuaWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZGRSb3coYXJyYXlGaWVsZClcIlxuICAgICAgICAgID4rIFJvdzwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGZvciAocm93IG9mIHJvd3NPZihhcnJheUZpZWxkKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93XCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3Jvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvdy10ZXh0XCI+e3sgcm93U3VtbWFyeShhcnJheUZpZWxkLCByb3cpIH19PC9zcGFuPlxuICAgICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidlZGl0LXJvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRWRpdFJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidkZWxldGUtcm93LScgKyBhcnJheUZpZWxkLmlkICsgJy0nICsgJGluZGV4XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgPHAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWVtcHR5XCI+Tm8gcm93cyB5ZXQuPC9wPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLVxuICAgIFJvdyBkcmF3ZXIuIERlbGliZXJhdGVseSBvdXRzaWRlIHRoZSB0YWIgcGFuZWw6IGJ1aWxkaW5nIGEgcm93J3MgRm9ybUdyb3VwIGluc2lkZSB0aGVcbiAgICB0YWIgdmlldyByYWNlcyB0aGUgdGFiJ3Mgb3duIGluaXRpYWxpc2F0aW9uICh0aGUgcmVmZXJlbmNlIGhpdCB0aGlzIHdpdGggRm9ybUFycmF5KS5cbiAgLS0+XG4gIEBpZiAoaW5saW5lUm93RmllbGQoKTsgYXMgcm93RmllbGQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2RyYXdlclwiIGRhdGEtdGVzdGlkPVwicm93LWRyYXdlclwiIFtmb3JtR3JvdXBdPVwiaW5saW5lUm93Rm9ybSFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkXCI+XG4gICAgICAgIDxzdHJvbmc+e3sgaW5saW5lUm93SW5kZXgoKSA9PT0gbnVsbCA/ICdBZGQnIDogJ0VkaXQnIH19IHt7IGZvcm1hdEZpZWxkTGFiZWwocm93RmllbGQpIH19IHJvdzwvc3Ryb25nPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZm9ybV9fcGFuZWxcIj5cbiAgICAgICAgQGZvciAoY2hpbGQgb2Ygcm93RmllbGQuY2hpbGRyZW4gPz8gW107IHRyYWNrIGNoaWxkLmlkKSB7XG4gICAgICAgICAgPG5neC1keW5hbWljLWZpZWxkXG4gICAgICAgICAgICBbZmllbGRdPVwiY2hpbGRcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwiaW5saW5lUm93Rm9ybSEuZ2V0KGNoaWxkLmlkKSFcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgICAgW2xhbmd1YWdlXT1cImxhbmd1YWdlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgICAgICAgICBbc3R5bGUuZ3JpZENvbHVtbl09XCInc3BhbiAxMidcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3Jlc2V0XCIgZGF0YS10ZXN0aWQ9XCJjYW5jZWwtcm93XCIgKGNsaWNrKT1cImNhbmNlbFJvdygpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3N1Ym1pdFwiIGRhdGEtdGVzdGlkPVwic2F2ZS1yb3dcIiAoY2xpY2spPVwic2F2ZVJvdygpXCI+U2F2ZSByb3c8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBNYWluIER5bmFtaWMgRm9ybSAtLT5cbiAgPG5neC1keW5hbWljLWZvcm1cbiAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgW3J1bGVzXT1cInJ1bGVzXCJcbiAgICBbaW5pdGlhbERhdGFdPVwiaW5pdGlhbERhdGFcIlxuICAgIFtvcmlnaW5hbERhdGFdPVwib3JpZ2luYWxCYXNlbGluZSgpXCJcbiAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgW2xhbmd1YWdlXT1cImxhbmd1YWdlXCJcbiAgICBbcmVhZG9ubHldPVwic2VjdGlvblJlYWRPbmx5XCJcbiAgICBbcmVhZE9ubHlGaWVsZHNdPVwicmVhZE9ubHlGaWVsZHNcIlxuICAgIFtzaG93SW5mb0Jhbm5lcnNdPVwiZmFsc2VcIlxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgIFtlcnJvcl09XCJlcnJvclwiXG4gICAgKGZvcm1DaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKCRldmVudClcIlxuICAgIChmb3JtU3VibWl0KT1cIm9uRm9ybVN1Ym1pdCgkZXZlbnQpXCJcbiAgICAoZm9ybVJlc2V0KT1cIm9uRm9ybVJlc2V0KClcIlxuICAgIChhY3RpdmVUYWJDaGFuZ2UpPVwib25BY3RpdmVUYWJDaGFuZ2UoJGV2ZW50KVwiXG4gIC8+XG48L2Rpdj5cbiJdfQ==
494
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUE4QixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7QUFFOUU7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFbEQ7Ozs7R0FJRztBQW9NSCxNQUFNLE9BQU8sMEJBQTBCO0lBQzVCLE1BQU0sQ0FBb0I7SUFDMUIsS0FBSyxDQUFjO0lBQ25CLFdBQVcsQ0FBdUI7SUFDbEMsU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixLQUFL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QUFDO2dCQUNQLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7d0dBMWRVLDBCQUEwQjs0RkFBMUIsMEJBQTBCLDZmQTRCMUIsb0JBQW9CLHFFQzlQakMsdWhQQWtNQSwwa0dEaEtZLFlBQVksOEJBQUUsbUJBQW1CLDRVQUFFLG9CQUFvQiw2VUFBRSxxQkFBcUI7OzRGQWdNN0UsMEJBQTBCO2tCQW5NdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDOzhCQWlNaEYsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQVFHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFMEIsZUFBZTtzQkFBL0MsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eUZvcm1Db25maWcsIEZvcm1SdWxlLCBOZXN0ZWRGaWVsZENvbmZpZywgTmVzdGVkVGFiQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgZmluZFRhYiwgZm9ybWF0RGlzcGxheVZhbHVlLCBnZXRUYWJEYXRhLCByZXNvbHZlTGFiZWwgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQvZHluYW1pYy1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnVsZXNFdmFsdWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3J1bGVzLWV2YWx1YXRpb24uc2VydmljZSc7XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBcIm5vIHRhYiBob2xkcyB0aGlzIGZpZWxkXCIgZnJvbSBcInRoZSBmaWVsZCBob2xkcyB1bmRlZmluZWRcIiwgc28gdGhlIHRhYiB3YWxrXG4gKiBjYW4ga2VlcCBzZWFyY2hpbmcgaW4gdGhlIGZpcnN0IGNhc2UgYW5kIHN0b3AgaW4gdGhlIHNlY29uZC5cbiAqL1xuY29uc3QgRklFTERfTk9UX0ZPVU5EID0gU3ltYm9sKCdmaWVsZC1ub3QtZm91bmQnKTtcblxuLyoqXG4gKiBEeW5hbWljUmVjb3JkRm9ybUNvbXBvbmVudCDigJQgY29tcHJlaGVuc2l2ZSB0YWJiZWQgcmVjb3JkIHZpZXcgJiBlZGl0IGNvbXBvbmVudC5cbiAqIFN1cHBvcnRzIGNyb3NzLXRhYiBydWxlIGV2YWx1YXRpb24sIHByb2ZpbGUgaGVhZGVyLCBzdW1tYXJ5IGRyYXdlciAoc2hvd09uTWluaW1pemUpLFxuICogaW50ZXJhY3RpdmUgcXVpY2stanVtcCBsaW5rcywgYW5kIGJhc2VsaW5lIG1vZGlmaWNhdGlvbiB0cmFja2luZy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWR5bmFtaWMtcmVjb3JkLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBEeW5hbWljRm9ybUNvbXBvbmVudCwgRHluYW1pY0ZpZWxkQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtcmVjb3JkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubmd4LXJlY29yZC1lZGl0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjNmNGY2O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX190aXRsZS1ncm91cCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyIHtcbiAgICAgICAgd2lkdGg6IDQ4cHg7XG4gICAgICAgIGhlaWdodDogNDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2UwZTdmZjtcbiAgICAgICAgY29sb3I6ICM0ZjQ2ZTU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdWJ0aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgY29sb3I6ICM2YjcyODA7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBjb2xvcjogIzM3NDE1MTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZS10ZXh0IHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyIHtcbiAgICAgICAgcGFkZGluZzogMTBweCAxNHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcbiAgICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzcyB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzczpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci0tZXJyb3Ige1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVjYWNhO1xuICAgICAgICBjb2xvcjogI2I5MWMxYztcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1iYXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1oaW50IHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLXdhcm5pbmcge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVmM2M3O1xuICAgICAgICBjb2xvcjogI2I0NTMwOTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93cyB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LXRleHQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19yb3ctYnRuIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWVtcHR5IHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogIzZiNzI4MDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19kcmF3ZXIge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGJlYWZlO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDE0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbCB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE4MHB4LCAxZnIpKTtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWl0ZW0ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktaXRlbTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktbGFiZWwge1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LXZhbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY29sb3I6ICMxZjI5Mzc7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1JlY29yZEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBFbnRpdHlGb3JtQ29uZmlnO1xuICBASW5wdXQoKSBydWxlcz86IEZvcm1SdWxlW107XG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgQElucHV0KCkgdXNlclJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaG9sZSByZWNvcmQgcmVhZC1vbmx5LCByZWdhcmRsZXNzIG9mIFJCQUMuIEVxdWl2YWxlbnQgdG8gdGhlIHJlZmVyZW5jZSdzIGBpc1JlYWRPbmx5YC4gKi9cbiAgQElucHV0KCkgaXNSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU3BlY2lmaWMgZmllbGQgaWRzIGZvcmNlZCByZWFkLW9ubHkgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIHJlY29yZCBzdGF5cyBlZGl0YWJsZS4gKi9cbiAgQElucHV0KCkgcmVhZE9ubHlGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIC8qKlxuICAgKiBPcGVuIHRoZSByZWNvcmQgcmVhZC1vbmx5LCB3aXRoIGEgcGVyLXRhYiBcIkVkaXQgc2VjdGlvblwiIGZsb3cg4oCUIG9uZSB0YWIgaXMgZWRpdGVkIGFuZFxuICAgKiB2YWxpZGF0ZWQgYXQgYSB0aW1lLiBUaGlzIGlzIHRoZSBmcmFtZXdvcmsncyBgRW50aXR5UmVjb3JkQ29tcG9uZW50YCBtb2RlbCBhbmQgdGhlXG4gICAqIGRlZmF1bHQgaGVyZS5cbiAgICpcbiAgICogU2V0IGZhbHNlIGZvciBhIGRpcmVjdGx5IGVkaXRhYmxlIHJlY29yZCB3aXRoIG5vIHZpZXcvZWRpdCBkaXN0aW5jdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIHZpZXdNb2RlOiBib29sZWFuID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj4oKTtcbiAgQE91dHB1dCgpIGZvcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZDxzdHJpbmcsIGFueT4+KCk7XG4gIEBPdXRwdXQoKSBmb3JtUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBPbmUgdGFiIHNlY3Rpb24gd2FzIHNhdmVkLiBDYXJyaWVzIHRoZSB3aG9sZSByZWNvcmQsIHBsdXMgd2hpY2ggdGFiIHdhcyBlZGl0ZWQuICovXG4gIEBPdXRwdXQoKSBzZWN0aW9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyB0YWJJZDogc3RyaW5nOyByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfT4oKTtcblxuICBAVmlld0NoaWxkKER5bmFtaWNGb3JtQ29tcG9uZW50KSBkeW5hbWljRm9ybUNvbXA/OiBEeW5hbWljRm9ybUNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJ1bGVzRXZhbHVhdGlvbiA9IGluamVjdChSdWxlc0V2YWx1YXRpb25TZXJ2aWNlKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0YSA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IG9yaWdpbmFsQmFzZWxpbmUgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgYW55Pj4oe30pO1xuXG4gIC8qKlxuICAgKiBJbmZvIGJhbm5lcnMgdGhlIHVzZXIgaGFzIGRpc21pc3NlZCwgYnkgZmllbGQgaWQuXG4gICAqXG4gICAqIFRoZSByZWZlcmVuY2UncyBjb250cmFjdDogYW4gaW5mbyBiYW5uZXIgcGVyc2lzdHMgdW50aWwgZGlzbWlzc2VkLCAqKm5vdCoqIHVudGlsIHRoZVxuICAgKiB2YWx1ZSBjaGFuZ2VzLiBEaXNtaXNzYWwgaXMga2V5ZWQgYnkgZmllbGQgc28gcmUtdHJpZ2dlcmluZyBhIGRpZmZlcmVudCBmaWVsZCdzIHJ1bGVcbiAgICogc3RpbGwgc2hvd3MuIFJlLWFybWVkIHdoZW4gYSBkaWZmZXJlbnQgcmVjb3JkIGlzIGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzbWlzc2VkID0gc2lnbmFsPFJlYWRvbmx5U2V0PHN0cmluZz4+KG5ldyBTZXQ8c3RyaW5nPigpKTtcblxuICAvKipcbiAgICogSW5mbyBiYW5uZXJzIGZyb20gdGhlIHJ1bGVzIGVuZ2luZSB0aGF0IGFyZSBzdGlsbCBzaG93aW5nLlxuICAgKlxuICAgKiBBIGdldHRlciwgbm90IGEgYGNvbXB1dGVkYDogdGhlIHNvdXJjZSBpcyBgZHluYW1pY0Zvcm1Db21wYCwgYSBWaWV3Q2hpbGQuIEEgY29tcHV0ZWRcbiAgICogZXZhbHVhdGVkIGJlZm9yZSB0aGUgdmlldyBpbml0aWFsaXNlcyB3b3VsZCBjYXB0dXJlIG5vIGRlcGVuZGVuY3kgb24gdGhlIGNoaWxkJ3NcbiAgICogYHJ1bGVSZXN1bHRgIHNpZ25hbCBhbmQgdGhlbiBuZXZlciByZWNvbXB1dGUuIFJlYWQgcGVyIGNoYW5nZS1kZXRlY3Rpb24gcGFzcyBpbnN0ZWFkLlxuICAgKi9cbiAgZ2V0IGluZm9CYW5uZXJzKCk6IHsgZmllbGRJZDogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8ucnVsZVJlc3VsdCgpO1xuICAgIGNvbnN0IGdvbmUgPSB0aGlzLmRpc21pc3NlZCgpO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQ/LmluZm9CYW5uZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW2ZpZWxkSWRdKSA9PiAhZ29uZS5oYXMoZmllbGRJZCkpXG4gICAgICAubWFwKChbZmllbGRJZCwgbWVzc2FnZV0pID0+ICh7IGZpZWxkSWQsIG1lc3NhZ2U6IFN0cmluZyhtZXNzYWdlKSB9KSk7XG4gIH1cblxuICBkaXNtaXNzSW5mb0Jhbm5lcihmaWVsZElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3NlZC5zZXQobmV3IFNldCh0aGlzLmRpc21pc3NlZCgpKS5hZGQoZmllbGRJZCkpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBub3RoaW5nIGluIHRoZSByZWNvcmQgbWF5IGJlIGVkaXRlZC4gKi9cbiAgZ2V0IHJlY29yZFJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuaXNSZWFkT25seTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbmxpbmUgYXJyYXktcm93IGVkaXRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEEgcm93IG9mIGFuIGBhcnJheWAgZmllbGQgaXMgZWRpdGVkIGluIGEgZHJhd2VyLCBub3QgaW5saW5lIGluIHRoZSB0YWIgcGFuZWwuXG4gICAqXG4gICAqIFRoZSBkcmF3ZXIgaXMgcmVuZGVyZWQgb3V0c2lkZSB0aGUgdGFiIGNvbnRhaW5lciBvbiBwdXJwb3NlOiB0aGUgcmVmZXJlbmNlIGZvdW5kIHRoYXRcbiAgICogYnVpbGRpbmcgYSByb3cncyBGb3JtR3JvdXAgaW5zaWRlIHRoZSB0YWIgdmlldyByYWNlcyB0aGUgdGFiJ3Mgb3duIGluaXRpYWxpc2F0aW9uLCBzb1xuICAgKiB0aGUgcm93IGZvcm0gaXMga2VwdCBkZXRhY2hlZCBhbmQgb25seSBwdXNoZWQgaW50byB0aGUgRm9ybUFycmF5IG9uIHNhdmUuXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVSb3dGaWVsZCA9IHNpZ25hbDxOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBpbmxpbmVSb3dJbmRleCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgaW5saW5lUm93Rm9ybTogRm9ybUdyb3VwIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIGBhcnJheWAgZmllbGRzIG9uIHRoZSB0YWIgY3VycmVudGx5IHNob3duLCBzbyB0aGUgdGVtcGxhdGUgY2FuIGxpc3QgdGhlaXIgcm93cy4gKi9cbiAgZ2V0IGFycmF5RmllbGRzRm9yQWN0aXZlVGFiKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5hY3RpdmVUYWJJZDtcbiAgICBjb25zdCB0YWIgPSB0YWJJZCA/IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKSA6IG51bGw7XG4gICAgcmV0dXJuICh0YWI/LmZpZWxkcyA/PyBbXSkuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnYXJyYXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3dzIGN1cnJlbnRseSBoZWxkIGJ5IGFuIGBhcnJheWAgZmllbGQsIHJlYWQgZnJvbSB0aGUgcmVjb3JkIHZhbHVlLlxuICAgKlxuICAgKiBEZWxpYmVyYXRlbHkgbm90IHJlYWQgb2ZmIHRoZSBjaGlsZCdzIEZvcm1BcnJheTogdGhhdCBjb250cm9sIG9ubHkgZXhpc3RzIG9uY2UgdGhlXG4gICAqIGNoaWxkIGhhcyBpbml0aWFsaXNlZCwgc28gcmVuZGVyaW5nIGZyb20gaXQgY2hhbmdlZCB2YWx1ZSBtaWQtcGFzcy4gYGN1cnJlbnREYXRhYCBpcyBhXG4gICAqIHNpZ25hbCBzZWVkZWQgZnJvbSBgaW5pdGlhbERhdGFgIGFuZCBrZXB0IGN1cnJlbnQgYnkgdGhlIGNoaWxkJ3MgYGZvcm1DaGFuZ2VgLlxuICAgKi9cbiAgcm93c09mKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10ge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5hY3RpdmVUYWJJZDtcbiAgICBjb25zdCB0YWJEYXRhID0gdGFiSWQgPyBnZXRUYWJEYXRhKHRhYklkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSA6IG51bGw7XG4gICAgY29uc3Qgcm93cyA9ICh0YWJEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LltmaWVsZC5pZF07XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocm93cykgPyAocm93cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA6IFtdO1xuICB9XG5cbiAgLyoqIE9uZSByb3cgcmVuZGVyZWQgYXMgdGV4dCwgc28gdGhlIGxpc3QgaXMgcmVhZGFibGUgd2l0aG91dCBvcGVuaW5nIHRoZSBkcmF3ZXIuICovXG4gIHJvd1N1bW1hcnkoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvdyA/PyB7fTtcbiAgICBjb25zdCBwYXJ0cyA9IChmaWVsZC5jaGlsZHJlbiA/PyBbXSlcbiAgICAgIC5tYXAoY2hpbGQgPT4gdmFsdWVbY2hpbGQuaWRdKVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwgJiYgdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09ICcnKVxuICAgICAgLm1hcCh2ID0+ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2KSA6IFN0cmluZyh2KSkpO1xuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPyBwYXJ0cy5qb2luKCcgwrcgJykgOiAnKGVtcHR5KSc7XG4gIH1cblxuICBvcGVuQWRkUm93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChudWxsKTtcbiAgICB0aGlzLmlubGluZVJvd0Zvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uY3JlYXRlQXJyYXlSb3coZmllbGQpIGFzIEZvcm1Hcm91cDtcbiAgfVxuXG4gIG9wZW5FZGl0Um93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChpbmRleCk7XG4gICAgdGhpcy5pbmxpbmVSb3dGb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA/LmNyZWF0ZUFycmF5Um93KGZpZWxkLCB0aGlzLnJvd3NPZihmaWVsZClbaW5kZXhdKSBhcyBGb3JtR3JvdXA7XG4gIH1cblxuICBjYW5jZWxSb3coKTogdm9pZCB7XG4gICAgdGhpcy5pbmxpbmVSb3dGaWVsZC5zZXQobnVsbCk7XG4gICAgdGhpcy5pbmxpbmVSb3dJbmRleC5zZXQobnVsbCk7XG4gICAgdGhpcy5pbmxpbmVSb3dGb3JtID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBDb21taXQgdGhlIGRyYXdlciBpbnRvIHRoZSBGb3JtQXJyYXkuIFJ1bGVzIHJlLWV2YWx1YXRlIG9mZiB0aGUgcmVzdWx0aW5nIHZhbHVlIGNoYW5nZS4gKi9cbiAgc2F2ZVJvdygpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaW5saW5lUm93RmllbGQoKTtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA7XG4gICAgaWYgKCFmaWVsZCB8fCAhZm9ybSB8fCAhdGhpcy5pbmxpbmVSb3dGb3JtKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5pbmxpbmVSb3dGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuaW5saW5lUm93Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXkgPSBmb3JtLmdldEFycmF5Q29udHJvbChmaWVsZC5pZCwgdGhpcy5hY3RpdmVUYWJJZCA/PyB1bmRlZmluZWQpO1xuICAgIGlmICghYXJyYXkpIHJldHVybjtcblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmxpbmVSb3dJbmRleCgpO1xuICAgIGlmIChpbmRleCA9PT0gbnVsbCkgYXJyYXkucHVzaChmb3JtLmNyZWF0ZUFycmF5Um93KGZpZWxkLCB0aGlzLmlubGluZVJvd0Zvcm0udmFsdWUpKTtcbiAgICBlbHNlIGFycmF5LmF0KGluZGV4KS5wYXRjaFZhbHVlKHRoaXMuaW5saW5lUm93Rm9ybS52YWx1ZSk7XG5cbiAgICBhcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoZm9ybS5leHRyYWN0UmVjb3JkKCkpO1xuICAgIHRoaXMuY2FuY2VsUm93KCk7XG4gIH1cblxuICBkZWxldGVSb3coZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VjdGlvblJlYWRPbmx5KSByZXR1cm47XG4gICAgY29uc3QgYXJyYXkgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uZ2V0QXJyYXlDb250cm9sKGZpZWxkLmlkLCB0aGlzLmFjdGl2ZVRhYklkID8/IHVuZGVmaW5lZCk7XG4gICAgYXJyYXk/LnJlbW92ZUF0KGluZGV4KTtcbiAgICBhcnJheT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcbiAgICBpZiAodGhpcy5pbmxpbmVSb3dJbmRleCgpID09PSBpbmRleCkgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQZXItdGFiIHNlY3Rpb24gZWRpdGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHRhYiBjdXJyZW50bHkgb3BlbiBmb3IgZWRpdGluZywgb3IgbnVsbCB3aGVuIHRoZSByZWNvcmQgaXMgYmVpbmcgdmlld2VkLlxuICAgKlxuICAgKiBUaGUgcmVmZXJlbmNlIGVkaXRzIG9uZSB0YWIgc2VjdGlvbiBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHJlY29yZCwgYW5kXG4gICAqIHZhbGlkYXRlcyBvbmx5IHRoYXQgc2VjdGlvbiBvbiBzYXZlIOKAlCBhIHJlcXVpcmVkIGZpZWxkIG9uIGFuIHVudG91Y2hlZCB0YWIgbXVzdCBub3RcbiAgICogYmxvY2sgc2F2aW5nIHRoZSB0YWIgeW91IGFyZSBhY3R1YWxseSB3b3JraW5nIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdGluZ1RhYklkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFiIHRoZSBpbm5lciBmb3JtIGlzIHNob3dpbmcuXG4gICAqXG4gICAqIFRyYWNrZWQgaGVyZSByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgVmlld0NoaWxkLiBUaGUgY2hpbGQgcmVzb2x2ZXMgaXRzIGZpcnN0IHRhYiBhc1xuICAgKiBwYXJ0IG9mIGl0cyBvd24gaW5pdGlhbGlzYXRpb24sIHNvIHJlYWRpbmcgaXQgZHVyaW5nIHRoaXMgY29tcG9uZW50J3MgcmVuZGVyIGNoYW5nZWRcbiAgICogdmFsdWUgbWlkLXBhc3Mg4oCUIGFuIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkIGVycm9yLiBTZWVkZWQgZnJvbSB0aGVcbiAgICogY29uZmlnIGFuZCBrZXB0IGluIHN0ZXAgYnkgdGhlIGNoaWxkJ3MgYGFjdGl2ZVRhYkNoYW5nZWAgb3V0cHV0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVUYWJJZFNpZyA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBnZXQgYWN0aXZlVGFiSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiSWRTaWcoKTtcbiAgfVxuXG4gIG9uQWN0aXZlVGFiQ2hhbmdlKHRhYklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVUYWJJZFNpZygpID09PSB0YWJJZCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlVGFiSWRTaWcuc2V0KHRhYklkKTtcbiAgICAvLyBFZGl0aW5nIGRvZXMgbm90IGZvbGxvdyB0aGUgdXNlciB0byBhbm90aGVyIHRhYi5cbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIC8qKiBGaXJzdCB0YWIgYSB1c2VyIGNhbiBzZWUsIHVzZWQgdG8gc2VlZCB0aGUgYWN0aXZlIHRhYiBiZWZvcmUgdGhlIGNoaWxkIHJlcG9ydHMgb25lLiAqL1xuICBwcml2YXRlIGZpcnN0VmlzaWJsZVRhYklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8udGFicz8uZmluZCh0ID0+IHQudmlzaWJpbGl0eSAhPT0gZmFsc2UpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEVycm9ycyBmcm9tIHRoZSBsYXN0IHNhdmUgYXR0ZW1wdCwgYnkgZmllbGQgaWQuICovXG4gIHJlYWRvbmx5IHNlY3Rpb25FcnJvcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuXG4gIC8qKiBUZW1wbGF0ZSBhY2Nlc3MgdG8gYE9iamVjdC5rZXlzYCBmb3IgaXRlcmF0aW5nIHRoZSBlcnJvciBtYXAuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBPYmplY3QgPSBPYmplY3Q7XG5cbiAgZ2V0IGlzRWRpdGluZ0FjdGl2ZVRhYigpOiBib29sZWFuIHtcbiAgICAvLyBXaXRob3V0IHZpZXcgbW9kZSB0aGVyZSBpcyBubyB2aWV3L2VkaXQgZGlzdGluY3Rpb24g4oCUIGV2ZXJ5dGhpbmcgaXMgYWx3YXlzIGVkaXRhYmxlLlxuICAgIGlmICghdGhpcy52aWV3TW9kZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdGhpcy5hY3RpdmVUYWJJZCAmJiB0aGlzLmVkaXRpbmdUYWJJZCgpID09PSB0aGlzLmFjdGl2ZVRhYklkO1xuICB9XG5cbiAgLyoqIEZpZWxkcyByZW5kZXIgcmVhZC1vbmx5IHVubGVzcyB0aGVpciBvd24gdGFiIGlzIHRoZSBvbmUgYmVpbmcgZWRpdGVkLiAqL1xuICBnZXQgc2VjdGlvblJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmlzRWRpdGluZ0FjdGl2ZVRhYjtcbiAgfVxuXG4gIGVkaXRTZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3TW9kZSB8fCB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmFjdGl2ZVRhYklkKSByZXR1cm47XG4gICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldCh7fSk7XG4gICAgdGhpcy5lZGl0aW5nVGFiSWQuc2V0KHRoaXMuYWN0aXZlVGFiSWQpO1xuICB9XG5cbiAgLyoqIERpc2NhcmQgdGhpcyBzZWN0aW9uJ3MgZWRpdHMsIHJlc3RvcmluZyBlYWNoIGZpZWxkIGZyb20gdGhlIHNlc3Npb24gYmFzZWxpbmUuICovXG4gIGNhbmNlbFNlY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdGFiSWQgPSB0aGlzLmVkaXRpbmdUYWJJZCgpO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcDtcbiAgICBpZiAodGFiSWQgJiYgZm9ybSkge1xuICAgICAgY29uc3QgdGFiID0gZmluZFRhYih0aGlzLmNvbmZpZz8udGFicywgdGFiSWQpO1xuICAgICAgY29uc3QgYmFzZWxpbmVUYWIgPSAoZ2V0VGFiRGF0YSh0YWJJZCwgdGhpcy5vcmlnaW5hbEJhc2VsaW5lKCksIHRoaXMuY29uZmlnKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRhYj8uZmllbGRzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGJhc2VsaW5lVmFsdWUgPSBiYXNlbGluZVRhYltmaWVsZC5pZF07XG5cbiAgICAgICAgLy8gQSBGb3JtQXJyYXkgY2Fubm90IGJlIHJlc3RvcmVkIHdpdGggc2V0VmFsdWUg4oCUIHRoYXQgZGVtYW5kcyBhIHZhbHVlIHNoYXBlZCBleGFjdGx5XG4gICAgICAgIC8vIGxpa2UgdGhlIGN1cnJlbnQgcm93cy4gUmVidWlsZCBpdCBmcm9tIHRoZSBiYXNlbGluZSByb3dzIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybS5nZXRBcnJheUNvbnRyb2woZmllbGQuaWQsIHRhYklkKTtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXkuY2xlYXIoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBBcnJheS5pc0FycmF5KGJhc2VsaW5lVmFsdWUpID8gYmFzZWxpbmVWYWx1ZSA6IFtdKSB7XG4gICAgICAgICAgICBhcnJheS5wdXNoKGZvcm0uY3JlYXRlQXJyYXlSb3coZmllbGQsIHJvdykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKT8uc2V0VmFsdWUoYmFzZWxpbmVWYWx1ZSA/PyBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudERhdGEuc2V0KGZvcm0uZXh0cmFjdFJlY29yZCgpKTtcbiAgICB9XG4gICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldCh7fSk7XG4gICAgdGhpcy5lZGl0aW5nVGFiSWQuc2V0KG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoaXMgc2VjdGlvbiBvbmx5LCB0aGVuIGVtaXQgaXQuIFZhbGlkYXRpb24gaXMgc2NvcGVkIHR3byB3YXlzOiBBbmd1bGFyXG4gICAqIHZhbGlkaXR5IG9mIHRoZSB0YWIncyBvd24gY29udHJvbHMsIGFuZCBydWxlcyBmaWx0ZXJlZCB0byB0aGlzIHRhYiDigJQgYSBydWxlIHRhcmdldGluZ1xuICAgKiBhIGhpZGRlbiB0YWIgbXVzdCBub3QgYmxvY2sgdGhlIHNhdmUgKHRoZSByZWZlcmVuY2UncyBPVjAtOTY4IGZpeCkuXG4gICAqL1xuICBzYXZlU2VjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJJZCA9IHRoaXMuZWRpdGluZ1RhYklkKCk7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wO1xuICAgIGlmICghdGFiSWQgfHwgIWZvcm0pIHJldHVybjtcblxuICAgIGNvbnN0IHRhYiA9IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKTtcbiAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGFiPy5maWVsZHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGN0cmwgPSBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKTtcbiAgICAgIGlmIChjdHJsPy5pbnZhbGlkKSB7XG4gICAgICAgIGN0cmwubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICBlcnJvcnNbZmllbGQuaWRdID0gYCR7cmVzb2x2ZUxhYmVsKGZpZWxkLmxhYmVsLCB0aGlzLmxhbmd1YWdlKX0gaXMgaW52YWxpZC5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlZCA9IHRoaXMucnVsZXNFdmFsdWF0aW9uLmZpbHRlckZvclRhYih0aGlzLnJ1bGVzLCB0YWJJZCwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IHJ1bGVFcnJvcnMgPSB0aGlzLnJ1bGVzRXZhbHVhdGlvbi5ldmFsdWF0ZShzY29wZWQsIGZvcm0uZm9ybVZhbHVlcygpLCB0aGlzLm9yaWdpbmFsQmFzZWxpbmUoKSlcbiAgICAgIC52YWxpZGF0aW9uRXJyb3JzO1xuICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCBydWxlRXJyb3JzKTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VjdGlvbkVycm9ycy5zZXQoZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG5cbiAgICBjb25zdCByZWNvcmQgPSBmb3JtLmV4dHJhY3RSZWNvcmQoKTtcbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChyZWNvcmQpO1xuICAgIHRoaXMuc2VjdGlvblNhdmUuZW1pdCh7IHRhYklkLCByZWNvcmQgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VlZCB0aGUgc2Vzc2lvbiBiYXNlbGluZSBmcm9tIHRoZSBsb2FkZWQgcmVjb3JkIHNvIGBWQUxVRV9DSEFOR0VEYCBydWxlcyBhbmQgdGhlXG4gICAqIG1vZGlmaWNhdGlvbiBiYW5uZXIgY29tcGFyZSBhZ2FpbnN0IHRoZSByZWNvcmQgYXMgaXQgd2FzIG9wZW5lZCDigJQgbm90IGFzIGl0IHdhc1xuICAgKiBhZnRlciB0aGUgZmlyc3Qga2V5c3Ryb2tlLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRGF0YSddIHx8IGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsQmFzZWxpbmUuc2V0KHsgLi4uKHRoaXMuaW5pdGlhbERhdGEgPz8ge30pIH0pO1xuICAgICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoeyAuLi4odGhpcy5pbml0aWFsRGF0YSA/PyB7fSkgfSk7XG4gICAgICB0aGlzLmFjdGl2ZVRhYklkU2lnLnNldCh0aGlzLmZpcnN0VmlzaWJsZVRhYklkKCkpO1xuICAgICAgLy8gQSBkaWZmZXJlbnQgcmVjb3JkIGlzIGEgZGlmZmVyZW50IHNldCBvZiBiYW5uZXJzIOKAlCByZS1hcm0gdGhlbS5cbiAgICAgIHRoaXMuZGlzbWlzc2VkLnNldChuZXcgU2V0PHN0cmluZz4oKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlY29yZFRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgcmV0dXJuICdSZWNvcmQnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5uYW1lID8gcmVzb2x2ZUxhYmVsKHRoaXMuY29uZmlnLm5hbWUsIHRoaXMubGFuZ3VhZ2UpIDogdGhpcy5jb25maWcuZW50aXR5O1xuICB9XG5cbiAgZ2V0IGF2YXRhckxldHRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5yZWNvcmRUaXRsZSB8fCAnUicpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEhlYWRlciBmaWVsZHMgKGlzUHJvZmlsZUltYWdlIC8gaXNIZWFkZXJUb2dnbGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFdmVyeSBmaWVsZCBpbiB0aGUgY29uZmlnLCBhdCBhbnkgZGVwdGguICovXG4gIHByaXZhdGUgYWxsRmllbGRzKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IG91dDogTmVzdGVkRmllbGRDb25maWdbXSA9IFtdO1xuICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzID8/IFtdKSB7XG4gICAgICAgIG91dC5wdXNoKGYpO1xuICAgICAgICB3YWxrRmllbGRzKGYuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0YWJzID8/IFtdKSB7XG4gICAgICAgIHdhbGtGaWVsZHModC5maWVsZHMpO1xuICAgICAgICB3YWxrVGFicyh0LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKHRoaXMuY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFRoZSBmaWVsZCBmbGFnZ2VkIGBpc1Byb2ZpbGVJbWFnZWAsIHJlbmRlcmVkIGFzIHRoZSByZWNvcmQgYXZhdGFyLiAqL1xuICBnZXQgaGVhZGVyUHJvZmlsZUZpZWxkKCk6IE5lc3RlZEZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWxsRmllbGRzKCkuZmluZChmID0+IGYuaXNQcm9maWxlSW1hZ2UpID8/IG51bGw7XG4gIH1cblxuICAvKiogVGhlIGZpZWxkIGZsYWdnZWQgYGlzSGVhZGVyVG9nZ2xlYCwgcmVuZGVyZWQgYXMgYSBzdGF0dXMgc3dpdGNoIGluIHRoZSBoZWFkZXIuICovXG4gIGdldCBoZWFkZXJUb2dnbGVGaWVsZCgpOiBOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFsbEZpZWxkcygpLmZpbmQoZiA9PiBmLmlzSGVhZGVyVG9nZ2xlKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEF2YXRhciBpbWFnZSBVUkwsIHdoZW4gdGhlIHByb2ZpbGUgZmllbGQgaG9sZHMgYSBwZXJzaXN0ZWQgRmlsZVJlZi4gKi9cbiAgZ2V0IHByb2ZpbGVJbWFnZVVybCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaGVhZGVyUHJvZmlsZUZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZFZhbHVlKGZpZWxkLmlkKSBhcyB7IHVybD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICByZXR1cm4gdmFsdWU/LnVybCA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGhlYWRlclRvZ2dsZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5oZWFkZXJUb2dnbGVGaWVsZDtcbiAgICByZXR1cm4gZmllbGQgPyB0aGlzLmZpZWxkVmFsdWUoZmllbGQuaWQpID09PSB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmxpcCB0aGUgaGVhZGVyIHRvZ2dsZS4gSXQgd3JpdGVzIHN0cmFpZ2h0IHRvIHRoZSBjb250cm9sIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2hcbiAgICogc2VjdGlvbiBlZGl0aW5nIOKAlCB0aGUgcmVmZXJlbmNlIHRyZWF0cyBpdCBhcyBhIHJlY29yZC1sZXZlbCBzdGF0dXMgc3dpdGNoLCBub3QgcGFydCBvZlxuICAgKiBhbnkgb25lIHRhYidzIHNlY3Rpb24uXG4gICAqL1xuICB0b2dnbGVIZWFkZXJTdGF0dXMoKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmhlYWRlclRvZ2dsZUZpZWxkO1xuICAgIGlmICghZmllbGQgfHwgdGhpcy5yZWNvcmRSZWFkT25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmNvbnRyb2xGb3IoZmllbGQuaWQpO1xuICAgIGlmICghY3RybCkgcmV0dXJuO1xuICAgIGN0cmwuc2V0VmFsdWUoIXRoaXMuaGVhZGVyVG9nZ2xlVmFsdWUpO1xuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcbiAgfVxuXG4gIC8qKiBMb2NhdGUgYSBmaWVsZCdzIGNvbnRyb2wgd2hlcmV2ZXIgaXQgbGl2ZXMsIHNpbmNlIGhlYWRlciBmaWVsZHMgbWF5IGJlIG9uIGFueSB0YWIuICovXG4gIHByaXZhdGUgY29udHJvbEZvcihmaWVsZElkOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRm9ybUNvbXA/LmdldENvbnRyb2woZmllbGRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZpZWxkJ3MgY3VycmVudCB2YWx1ZSwgcmVhZCBmcm9tIHRoZSByZWNvcmQgc28gaXQgaXMgc3RhYmxlIGR1cmluZyByZW5kZXIuXG4gICAqXG4gICAqIFJlc29sdmVkIHRocm91Z2ggYGdldFRhYkRhdGFgIHNvIGl0IGhvbm91cnMgZXhhY3RseSB0aGUgbmVzdGluZyBjb250cmFjdCB0aGUgZm9ybVxuICAgKiBwYXRjaGVzIHdpdGgg4oCUIGB7IHRhYklkOiB7IGZpZWxkSWQgfSB9YCwgb3IgdGhlIHJlY29yZCByb290IHdoZW4gdGhlIHRhYiBzZXRzXG4gICAqIGBmbGF0RGF0YWAuIFJlYWRpbmcgdGhlIHJlY29yZCBmbGF0IGluc3RlYWQgaXMgbm90IGEgc2hvcnRjdXQ6IGl0IG1ha2VzIHRoZSBzdW1tYXJ5XG4gICAqIGRpc3BsYXkgdmFsdWVzIHRoZSBmb3JtIG5ldmVyIGxvYWRlZCwgd2hpY2ggcmVhZHMgYXMgXCJ0aGUgZGF0YSBpcyB0aGVyZVwiIHdoaWxlIGV2ZXJ5XG4gICAqIGNvbnRyb2wgYmVoaW5kIGl0IGlzIGVtcHR5LlxuICAgKlxuICAgKiBXYWxrcyBzdWItdGFicyBhcyB3ZWxsOiBhIHN1bW1hcnksIGhlYWRlciwgb3IgcHJvZmlsZSBmaWVsZCBtYXkgc2l0IG9uIGFueSB0YWIgYXQgYW55XG4gICAqIGRlcHRoLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWVsZFZhbHVlKGZpZWxkSWQ6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHZpc2l0ID0gKHRhYnM6IE5lc3RlZFRhYkNvbmZpZ1tdID0gW10pOiB1bmtub3duID0+IHtcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRhYnMpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGdldFRhYkRhdGEodGFiLmlkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gICAgICAgIGlmIChkYXRhICYmIGZpZWxkSWQgaW4gZGF0YSkgcmV0dXJuIGRhdGFbZmllbGRJZF07XG4gICAgICAgIGlmICh0YWIuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHZpc2l0KHRhYi5jaGlsZHJlbik7XG4gICAgICAgICAgaWYgKGZvdW5kICE9PSBGSUVMRF9OT1RfRk9VTkQpIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIEZJRUxEX05PVF9GT1VORDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdmlzaXQodGhpcy5jb25maWc/LnRhYnMpO1xuICAgIHJldHVybiByZXN1bHQgPT09IEZJRUxEX05PVF9GT1VORCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuXG4gIHJlYWRvbmx5IGlzTW9kaWZpZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3JpZyA9IHRoaXMub3JpZ2luYWxCYXNlbGluZSgpO1xuICAgIGNvbnN0IGN1cnIgPSB0aGlzLmN1cnJlbnREYXRhKCk7XG4gICAgaWYgKCFvcmlnIHx8ICFjdXJyIHx8IE9iamVjdC5rZXlzKG9yaWcpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvcmlnKSAhPT0gSlNPTi5zdHJpbmdpZnkoY3Vycik7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN1bW1hcnlGaWVsZHMgPSBjb21wdXRlZDxOZXN0ZWRGaWVsZENvbmZpZ1tdPigoKSA9PiB7XG4gICAgY29uc3QgZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdID0gW107XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gPSBbXSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0IG9mIHRhYnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHQuZmllbGRzID8/IFtdKSB7XG4gICAgICAgICAgaWYgKGYuc2hvd09uTWluaW1pemUpIGZpZWxkcy5wdXNoKGYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0LmNoaWxkcmVuKSB3YWxrVGFicyh0LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKHRoaXMuY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9KTtcblxuICBvbkZvcm1DaGFuZ2UoZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIC8vIEJhc2VsaW5lIGlzIHNlZWRlZCBmcm9tIGBpbml0aWFsRGF0YWAgaW4gbmdPbkNoYW5nZXM7IG9ubHkgZmlsbCBpdCBoZXJlIHdoZW4gdGhlXG4gICAgLy8gcmVjb3JkIHdhcyBvcGVuZWQgZW1wdHkgKGNyZWF0ZSBmbG93KSwgc28gdGhlIGZpcnN0IGVtaXR0ZWQgc2hhcGUgYmVjb21lcyB0aGUgYmFzZWxpbmUuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3JpZ2luYWxCYXNlbGluZSgpKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub3JpZ2luYWxCYXNlbGluZS5zZXQoeyAuLi5kYXRhIH0pO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChkYXRhKTtcbiAgICB0aGlzLmZvcm1DaGFuZ2UuZW1pdChkYXRhKTtcbiAgfVxuXG4gIG9uRm9ybVN1Ym1pdChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoZGF0YSk7XG4gIH1cblxuICBvbkZvcm1SZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1SZXNldC5lbWl0KCk7XG4gIH1cblxuICBmb3JtYXRGaWVsZExhYmVsKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbChmaWVsZC5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICAvKiogU3VtbWFyeSB2YWx1ZXMgcmVuZGVyIHRocm91Z2ggdGhlIHNoYXJlZCBjb3JlIGZvcm1hdHRlciwgbm90IGEgbG9jYWwgc3RyaW5naWZpZXIuICovXG4gIGZvcm1hdEZpZWxkVmFsdWUoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0RGlzcGxheVZhbHVlKGZpZWxkLnR5cGUsIGZpZWxkLm9wdGlvbnMsIHRoaXMuZmllbGRWYWx1ZShmaWVsZC5pZCksIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAganVtcFRvRmllbGQoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRmluZCBwYXJlbnQgdGFiIGZvciBmaWVsZFxuICAgIGZvciAoY29uc3QgdGFiIG9mIHRoaXMuY29uZmlnPy50YWJzIHx8IFtdKSB7XG4gICAgICBjb25zdCBoYXNGaWVsZCA9ICh0YWIuZmllbGRzIHx8IFtdKS5zb21lKGYgPT4gZi5pZCA9PT0gZmllbGRJZCk7XG4gICAgICBpZiAoaGFzRmllbGQpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRm9ybUNvbXA/LnNldEFjdGl2ZVRhYih0YWIuaWQpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBmaWVsZC1jb250YWluZXItJHtmaWVsZElkfWApO1xuICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yXCI+XG4gIDwhLS0gUmVjb3JkIEhlYWRlciAtLT5cbiAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlLWdyb3VwXCI+XG4gICAgICBAaWYgKHByb2ZpbGVJbWFnZVVybCkge1xuICAgICAgICA8aW1nXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImhlYWRlci1wcm9maWxlLWltYWdlXCJcbiAgICAgICAgICBbc3JjXT1cInByb2ZpbGVJbWFnZVVybFwiXG4gICAgICAgICAgW2FsdF09XCJyZWNvcmRUaXRsZVwiXG4gICAgICAgIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19hdmF0YXJcIiBkYXRhLXRlc3RpZD1cImhlYWRlci1hdmF0YXItaW5pdGlhbFwiPlxuICAgICAgICAgIHt7IGF2YXRhckxldHRlciB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXY+XG4gICAgICAgIDxoMiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX190aXRsZVwiIGRhdGEtdGVzdGlkPVwicmVjb3JkLXRpdGxlXCI+XG4gICAgICAgICAge3sgcmVjb3JkVGl0bGUgfX1cbiAgICAgICAgPC9oMj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VidGl0bGVcIj5FbnRpdHk6IHt7IGNvbmZpZy5lbnRpdHkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmVjb3JkLWxldmVsIHN0YXR1cyBzd2l0Y2gsIG91dHNpZGUgc2VjdGlvbiBlZGl0aW5nIC0tPlxuICAgIEBpZiAoaGVhZGVyVG9nZ2xlRmllbGQ7IGFzIHRvZ2dsZUZpZWxkKSB7XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZVwiPlxuICAgICAgICA8c3Bhbj57eyBmb3JtYXRGaWVsZExhYmVsKHRvZ2dsZUZpZWxkKSB9fTwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICByb2xlPVwic3dpdGNoXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImhlYWRlci10b2dnbGVcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImhlYWRlclRvZ2dsZVZhbHVlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVjb3JkUmVhZE9ubHlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJoZWFkZXJUb2dnbGVWYWx1ZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVIZWFkZXJTdGF0dXMoKVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUtdGV4dFwiPnt7IGhlYWRlclRvZ2dsZVZhbHVlID8gJ1llcycgOiAnTm8nIH19PC9zcGFuPlxuICAgICAgPC9sYWJlbD5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gRGlzbWlzc2libGUgaW5mbyBiYW5uZXJzIChydWxlcyBgaW5mb2AgYWN0aW9uKSAtLT5cbiAgQGZvciAoYmFubmVyIG9mIGluZm9CYW5uZXJzOyB0cmFjayBiYW5uZXIuZmllbGRJZCkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvXCJcbiAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2luZm8tYmFubmVyLScgKyBiYW5uZXIuZmllbGRJZFwiXG4gICAgPlxuICAgICAgPHNwYW4+4oS577iPIHt7IGJhbm5lci5tZXNzYWdlIH19PC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLWRpc21pc3NcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZGlzbWlzcy0nICsgYmFubmVyLmZpZWxkSWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEaXNtaXNzOiAnICsgYmFubmVyLm1lc3NhZ2VcIlxuICAgICAgICAoY2xpY2spPVwiZGlzbWlzc0luZm9CYW5uZXIoYmFubmVyLmZpZWxkSWQpXCJcbiAgICAgID7inJU8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gTW9kaWZpY2F0aW9uIGJhc2VsaW5lIGJhbm5lciAtLT5cbiAgQGlmIChpc01vZGlmaWVkKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS13YXJuaW5nXCI+XG4gICAgICDwn5SSIFJlY29yZCBtb2RpZmllZCBmcm9tIHNlc3Npb24gYmFzZWxpbmUg4oCUIHVuc2F2ZWQgY2hhbmdlcyBwZW5kaW5nLlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBTdW1tYXJ5IFBhbmVsIChzaG93T25NaW5pbWl6ZSBmaWVsZHMgd2l0aCBpbnRlcmFjdGl2ZSBqdW1wKSAtLT5cbiAgQGlmIChzdW1tYXJ5RmllbGRzKCkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbFwiIGRhdGEtdGVzdGlkPVwic3VtbWFyeS1wYW5lbFwiPlxuICAgICAgQGZvciAoc2Ygb2Ygc3VtbWFyeUZpZWxkcygpOyB0cmFjayBzZi5pZCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1pdGVtXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInc3VtbWFyeS0nICsgc2YuaWRcIlxuICAgICAgICAgIChjbGljayk9XCJqdW1wVG9GaWVsZChzZi5pZClcIlxuICAgICAgICAgIFt0aXRsZV09XCInQ2xpY2sgdG8ganVtcCB0byAnICsgZm9ybWF0RmllbGRMYWJlbChzZilcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1sYWJlbFwiPnt7IGZvcm1hdEZpZWxkTGFiZWwoc2YpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktdmFsXCI+e3sgZm9ybWF0RmllbGRWYWx1ZShzZikgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBTZWN0aW9uIGVkaXQgYmFyOiBvbmUgdGFiIGlzIGVkaXRlZCBhdCBhIHRpbWUsIGFuZCB2YWxpZGF0ZWQgb24gaXRzIG93biAtLT5cbiAgQGlmICh2aWV3TW9kZSAmJiAhcmVjb3JkUmVhZE9ubHkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XG4gICAgICBAaWYgKGlzRWRpdGluZ0FjdGl2ZVRhYikge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWhpbnRcIj5FZGl0aW5nIHRoaXMgc2VjdGlvbjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIiBkYXRhLXRlc3RpZD1cImNhbmNlbC1zZWN0aW9uXCIgKGNsaWNrKT1cImNhbmNlbFNlY3Rpb24oKVwiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fc3VibWl0XCIgZGF0YS10ZXN0aWQ9XCJzYXZlLXNlY3Rpb25cIiAoY2xpY2spPVwic2F2ZVNlY3Rpb24oKVwiPlxuICAgICAgICAgIFNhdmUgc2VjdGlvblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1mb3JtX19yZXNldFwiIGRhdGEtdGVzdGlkPVwiZWRpdC1zZWN0aW9uXCIgKGNsaWNrKT1cImVkaXRTZWN0aW9uKClcIj5cbiAgICAgICAgICBFZGl0IHNlY3Rpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyIG5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLWVycm9yXCIgcm9sZT1cImFsZXJ0XCIgZGF0YS10ZXN0aWQ9XCJzZWN0aW9uLWVycm9yc1wiPlxuICAgICAgQGZvciAoa2V5IG9mIE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSk7IHRyYWNrIGtleSkge1xuICAgICAgICA8ZGl2PuKaoO+4jyB7eyBzZWN0aW9uRXJyb3JzKClba2V5XSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBBcnJheSByb3dzOiBsaXN0ZWQgaGVyZSwgZWRpdGVkIGluIHRoZSBkcmF3ZXIgYmVsb3cgLS0+XG4gIEBmb3IgKGFycmF5RmllbGQgb2YgYXJyYXlGaWVsZHNGb3JBY3RpdmVUYWI7IHRyYWNrIGFycmF5RmllbGQuaWQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvd3NcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCIncm93cy0nICsgYXJyYXlGaWVsZC5pZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3dzLWhlYWRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1sYWJlbFwiPnt7IGZvcm1hdEZpZWxkTGFiZWwoYXJyYXlGaWVsZCkgfX08L3NwYW4+XG4gICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2FkZC1yb3ctJyArIGFycmF5RmllbGQuaWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZGRSb3coYXJyYXlGaWVsZClcIlxuICAgICAgICAgID4rIFJvdzwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGZvciAocm93IG9mIHJvd3NPZihhcnJheUZpZWxkKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93XCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3Jvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvdy10ZXh0XCI+e3sgcm93U3VtbWFyeShhcnJheUZpZWxkLCByb3cpIH19PC9zcGFuPlxuICAgICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidlZGl0LXJvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRWRpdFJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidkZWxldGUtcm93LScgKyBhcnJheUZpZWxkLmlkICsgJy0nICsgJGluZGV4XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgPHAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWVtcHR5XCI+Tm8gcm93cyB5ZXQuPC9wPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLVxuICAgIFJvdyBkcmF3ZXIuIERlbGliZXJhdGVseSBvdXRzaWRlIHRoZSB0YWIgcGFuZWw6IGJ1aWxkaW5nIGEgcm93J3MgRm9ybUdyb3VwIGluc2lkZSB0aGVcbiAgICB0YWIgdmlldyByYWNlcyB0aGUgdGFiJ3Mgb3duIGluaXRpYWxpc2F0aW9uICh0aGUgcmVmZXJlbmNlIGhpdCB0aGlzIHdpdGggRm9ybUFycmF5KS5cbiAgLS0+XG4gIEBpZiAoaW5saW5lUm93RmllbGQoKTsgYXMgcm93RmllbGQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2RyYXdlclwiIGRhdGEtdGVzdGlkPVwicm93LWRyYXdlclwiIFtmb3JtR3JvdXBdPVwiaW5saW5lUm93Rm9ybSFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkXCI+XG4gICAgICAgIDxzdHJvbmc+e3sgaW5saW5lUm93SW5kZXgoKSA9PT0gbnVsbCA/ICdBZGQnIDogJ0VkaXQnIH19IHt7IGZvcm1hdEZpZWxkTGFiZWwocm93RmllbGQpIH19IHJvdzwvc3Ryb25nPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZm9ybV9fcGFuZWxcIj5cbiAgICAgICAgQGZvciAoY2hpbGQgb2Ygcm93RmllbGQuY2hpbGRyZW4gPz8gW107IHRyYWNrIGNoaWxkLmlkKSB7XG4gICAgICAgICAgPG5neC1keW5hbWljLWZpZWxkXG4gICAgICAgICAgICBbZmllbGRdPVwiY2hpbGRcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwiaW5saW5lUm93Rm9ybSEuZ2V0KGNoaWxkLmlkKSFcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgICAgW2xhbmd1YWdlXT1cImxhbmd1YWdlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgICAgICAgICBbc3R5bGUuZ3JpZENvbHVtbl09XCInc3BhbiAxMidcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3Jlc2V0XCIgZGF0YS10ZXN0aWQ9XCJjYW5jZWwtcm93XCIgKGNsaWNrKT1cImNhbmNlbFJvdygpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3N1Ym1pdFwiIGRhdGEtdGVzdGlkPVwic2F2ZS1yb3dcIiAoY2xpY2spPVwic2F2ZVJvdygpXCI+U2F2ZSByb3c8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBNYWluIER5bmFtaWMgRm9ybSAtLT5cbiAgPG5neC1keW5hbWljLWZvcm1cbiAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgW3J1bGVzXT1cInJ1bGVzXCJcbiAgICBbaW5pdGlhbERhdGFdPVwiaW5pdGlhbERhdGFcIlxuICAgIFtvcmlnaW5hbERhdGFdPVwib3JpZ2luYWxCYXNlbGluZSgpXCJcbiAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgW2xhbmd1YWdlXT1cImxhbmd1YWdlXCJcbiAgICBbcmVhZG9ubHldPVwic2VjdGlvblJlYWRPbmx5XCJcbiAgICBbcmVhZE9ubHlGaWVsZHNdPVwicmVhZE9ubHlGaWVsZHNcIlxuICAgIFtzaG93SW5mb0Jhbm5lcnNdPVwiZmFsc2VcIlxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgIFtlcnJvcl09XCJlcnJvclwiXG4gICAgKGZvcm1DaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKCRldmVudClcIlxuICAgIChmb3JtU3VibWl0KT1cIm9uRm9ybVN1Ym1pdCgkZXZlbnQpXCJcbiAgICAoZm9ybVJlc2V0KT1cIm9uRm9ybVJlc2V0KClcIlxuICAgIChhY3RpdmVUYWJDaGFuZ2UpPVwib25BY3RpdmVUYWJDaGFuZ2UoJGV2ZW50KVwiXG4gIC8+XG48L2Rpdj5cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { makeEnvironmentProviders } from '@angular/core';
2
- import { ENTITY_REF_REGISTRY, FIELD_TYPE_REGISTRY, HOOK_REGISTRY, RECORD_MIGRATIONS, LOOKUP_REGISTRY, MASKED_ROLES, VALIDATOR_REGISTRY, } from '../tokens/injection-tokens';
2
+ import { ENTITY_REF_REGISTRY, FIELD_TYPE_REGISTRY, HOOK_REGISTRY, ASYNC_VALIDATOR_REGISTRY, RECORD_MIGRATIONS, VALIDATION_MESSAGES, LOOKUP_REGISTRY, MASKED_ROLES, VALIDATOR_REGISTRY, } from '../tokens/injection-tokens';
3
3
  /**
4
4
  * Provider function for ngx-dynamic-entity.
5
5
  * All options are optional — consumers provide only what they use (ISP).
@@ -16,7 +16,12 @@ export const provideNgxDynamicEntity = (config = {}) => makeEnvironmentProviders
16
16
  { provide: ENTITY_REF_REGISTRY, useValue: new Map(Object.entries(config.entityRefs ?? {})) },
17
17
  { provide: LOOKUP_REGISTRY, useValue: new Map(Object.entries(config.lookups ?? {})) },
18
18
  { provide: VALIDATOR_REGISTRY, useValue: new Map(Object.entries(config.validators ?? {})) },
19
+ {
20
+ provide: ASYNC_VALIDATOR_REGISTRY,
21
+ useValue: new Map(Object.entries(config.asyncValidators ?? {})),
22
+ },
19
23
  { provide: HOOK_REGISTRY, useValue: new Map(Object.entries(config.hooks ?? {})) },
20
24
  { provide: RECORD_MIGRATIONS, useValue: config.migrations ?? [] },
25
+ { provide: VALIDATION_MESSAGES, useValue: config.validationMessages ?? {} },
21
26
  ]);
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1uZ3gtZHluYW1pYy1lbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Byb3ZpZGVycy9wcm92aWRlLW5neC1keW5hbWljLWVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdCLHdCQUF3QixFQUFRLE1BQU0sZUFBZSxDQUFDO0FBRXJGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGFBQWEsRUFFYixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFlBQVksRUFDWixrQkFBa0IsR0FDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQTZCcEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxTQUFpQyxFQUFFLEVBQXdCLEVBQUUsQ0FDbkcsd0JBQXdCLENBQUM7SUFDdkIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRTtJQUM3RCxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDNUYsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQzVGLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDckYsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQzNGLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDakYsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFO0NBQ2xFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50UHJvdmlkZXJzLCBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgRW50aXR5UmVmZXJlbmNlTG9hZGVyLCBMb29rdXBMaXN0U291cmNlLCBSZWNvcmRNaWdyYXRpb24gfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQge1xuICBFTlRJVFlfUkVGX1JFR0lTVFJZLFxuICBGSUVMRF9UWVBFX1JFR0lTVFJZLFxuICBIT09LX1JFR0lTVFJZLFxuICB0eXBlIEhvb2tGbixcbiAgUkVDT1JEX01JR1JBVElPTlMsXG4gIExPT0tVUF9SRUdJU1RSWSxcbiAgTUFTS0VEX1JPTEVTLFxuICBWQUxJREFUT1JfUkVHSVNUUlksXG59IGZyb20gJy4uL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3hEeW5hbWljRW50aXR5Q29uZmlnIHtcbiAgLyoqIFJvbGVzIHRoYXQgc2VlIG1hc2tlZCBmaWVsZCB2YWx1ZXMgYXMgWFhYWFhYWFhYICovXG4gIG1hc2tlZFJvbGVzPzogc3RyaW5nW107XG4gIC8qKiBDdXN0b20gZmllbGQgdHlwZSBjb21wb25lbnRzIGtleWVkIGJ5IHR5cGUgc3RyaW5nICovXG4gIGZpZWxkVHlwZXM/OiBSZWNvcmQ8c3RyaW5nLCBUeXBlPGFueT4+O1xuICAvKipcbiAgICogRW50aXR5LXJlZiBvcHRpb24gbG9hZGVycyBrZXllZCBieSBlbnRpdHkga2V5IChBRFItMDA2KS5cbiAgICogRWFjaCByZWNlaXZlcyBgeyBwYXJlbnRWYWx1ZSwgZmlsdGVycywgbGFuZyB9YCBhbmQgbWF5IHJldHVybiBhbiBhcnJheSwgUHJvbWlzZSwgb3IgT2JzZXJ2YWJsZS5cbiAgICovXG4gIGVudGl0eVJlZnM/OiBSZWNvcmQ8c3RyaW5nLCBFbnRpdHlSZWZlcmVuY2VMb2FkZXI+O1xuICAvKipcbiAgICogTmFtZWQgbWFzdGVyIGxpc3RzIGtleWVkIGJ5IGxpc3QgbmFtZSwgZm9yIGZpZWxkcyB0aGF0IHNldCBgbGlzdE5hbWVgLlxuICAgKiBFYWNoIG1heSBiZSB0aGUgdmFsdWVzIHRoZW1zZWx2ZXMgKGFycmF5L1Byb21pc2UvT2JzZXJ2YWJsZSkgb3IgYSBsb2FkZXIgZnVuY3Rpb24g4oCUIHByZWZlclxuICAgKiBhIGxvYWRlciBmb3IgYW55dGhpbmcgZmV0Y2hlZCwgc28gYW4gdW51c2VkIGxpc3QgaXMgbmV2ZXIgbG9hZGVkLlxuICAgKi9cbiAgbG9va3Vwcz86IFJlY29yZDxzdHJpbmcsIExvb2t1cExpc3RTb3VyY2U+O1xuICAvKiogQ3VzdG9tIHZhbGlkYXRvciBmdW5jdGlvbnMga2V5ZWQgYnkgdmFsaWRhdG9yIG5hbWUgKi9cbiAgdmFsaWRhdG9ycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBIb29rIGZ1bmN0aW9ucyBrZXllZCBieSBob29rIG5hbWUgKi9cbiAgaG9va3M/OiBSZWNvcmQ8c3RyaW5nLCBIb29rRm4+O1xuICAvKipcbiAgICogT3JkZXJlZCBzdGVwcyB0aGF0IHVwZ3JhZGUgYSBzYXZlZCByZWNvcmQgd2hlbiBgRW50aXR5Rm9ybUNvbmZpZy52ZXJzaW9uYCBtb3ZlcyBhaGVhZFxuICAgKiBvZiB0aGUgcmVjb3JkJ3MgYF9jb25maWdWZXJzaW9uYC4gQXBwbGllZCB0byBgaW5pdGlhbERhdGFgIGJlZm9yZSB0aGUgZm9ybSBpcyBwYXRjaGVkLlxuICAgKi9cbiAgbWlncmF0aW9ucz86IFJlY29yZE1pZ3JhdGlvbltdO1xufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZ1bmN0aW9uIGZvciBuZ3gtZHluYW1pYy1lbnRpdHkuXG4gKiBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwg4oCUIGNvbnN1bWVycyBwcm92aWRlIG9ubHkgd2hhdCB0aGV5IHVzZSAoSVNQKS5cbiAqXG4gKiBVc2FnZSBpbiBhcHAuY29uZmlnLnRzOlxuICogICBwcm92aWRlTmd4RHluYW1pY0VudGl0eSh7XG4gKiAgICAgbWFza2VkUm9sZXM6IFsnSVRfU1VQUE9SVCddLFxuICogICAgIGVudGl0eVJlZnM6IHsgY2xpZW50czogKCkgPT4gY2xpZW50U2VydmljZS5nZXRPcHRpb25zKCkgfSxcbiAqICAgfSlcbiAqL1xuZXhwb3J0IGNvbnN0IHByb3ZpZGVOZ3hEeW5hbWljRW50aXR5ID0gKGNvbmZpZzogTmd4RHluYW1pY0VudGl0eUNvbmZpZyA9IHt9KTogRW52aXJvbm1lbnRQcm92aWRlcnMgPT5cbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7IHByb3ZpZGU6IE1BU0tFRF9ST0xFUywgdXNlVmFsdWU6IGNvbmZpZy5tYXNrZWRSb2xlcyA/PyBbXSB9LFxuICAgIHsgcHJvdmlkZTogRklFTERfVFlQRV9SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmZpZWxkVHlwZXMgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogRU5USVRZX1JFRl9SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmVudGl0eVJlZnMgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogTE9PS1VQX1JFR0lTVFJZLCB1c2VWYWx1ZTogbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcubG9va3VwcyA/PyB7fSkpIH0sXG4gICAgeyBwcm92aWRlOiBWQUxJREFUT1JfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy52YWxpZGF0b3JzID8/IHt9KSkgfSxcbiAgICB7IHByb3ZpZGU6IEhPT0tfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5ob29rcyA/PyB7fSkpIH0sXG4gICAgeyBwcm92aWRlOiBSRUNPUkRfTUlHUkFUSU9OUywgdXNlVmFsdWU6IGNvbmZpZy5taWdyYXRpb25zID8/IFtdIH0sXG4gIF0pO1xuIl19
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1uZ3gtZHluYW1pYy1lbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Byb3ZpZGVycy9wcm92aWRlLW5neC1keW5hbWljLWVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdCLHdCQUF3QixFQUFRLE1BQU0sZUFBZSxDQUFDO0FBRXJGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGFBQWEsRUFFYix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsWUFBWSxFQUNaLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBNkNwQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLFNBQWlDLEVBQUUsRUFBd0IsRUFBRSxDQUNuRyx3QkFBd0IsQ0FBQztJQUN2QixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFO0lBQzdELEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtJQUM1RixFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDNUYsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNyRixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDM0Y7UUFDRSxPQUFPLEVBQUUsd0JBQXdCO1FBQ2pDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7S0FDaEU7SUFDRCxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ2pGLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRTtJQUNqRSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsRUFBRTtDQUM1RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVJlZmVyZW5jZUxvYWRlciwgTG9va3VwTGlzdFNvdXJjZSwgUmVjb3JkTWlncmF0aW9uIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHtcbiAgRU5USVRZX1JFRl9SRUdJU1RSWSxcbiAgRklFTERfVFlQRV9SRUdJU1RSWSxcbiAgSE9PS19SRUdJU1RSWSxcbiAgdHlwZSBIb29rRm4sXG4gIEFTWU5DX1ZBTElEQVRPUl9SRUdJU1RSWSxcbiAgUkVDT1JEX01JR1JBVElPTlMsXG4gIFZBTElEQVRJT05fTUVTU0FHRVMsXG4gIExPT0tVUF9SRUdJU1RSWSxcbiAgTUFTS0VEX1JPTEVTLFxuICBWQUxJREFUT1JfUkVHSVNUUlksXG59IGZyb20gJy4uL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3hEeW5hbWljRW50aXR5Q29uZmlnIHtcbiAgLyoqIFJvbGVzIHRoYXQgc2VlIG1hc2tlZCBmaWVsZCB2YWx1ZXMgYXMgWFhYWFhYWFhYICovXG4gIG1hc2tlZFJvbGVzPzogc3RyaW5nW107XG4gIC8qKiBDdXN0b20gZmllbGQgdHlwZSBjb21wb25lbnRzIGtleWVkIGJ5IHR5cGUgc3RyaW5nICovXG4gIGZpZWxkVHlwZXM/OiBSZWNvcmQ8c3RyaW5nLCBUeXBlPGFueT4+O1xuICAvKipcbiAgICogRW50aXR5LXJlZiBvcHRpb24gbG9hZGVycyBrZXllZCBieSBlbnRpdHkga2V5LlxuICAgKiBFYWNoIHJlY2VpdmVzIGB7IHBhcmVudFZhbHVlLCBmaWx0ZXJzLCBsYW5nIH1gIGFuZCBtYXkgcmV0dXJuIGFuIGFycmF5LCBQcm9taXNlLCBvciBPYnNlcnZhYmxlLlxuICAgKi9cbiAgZW50aXR5UmVmcz86IFJlY29yZDxzdHJpbmcsIEVudGl0eVJlZmVyZW5jZUxvYWRlcj47XG4gIC8qKlxuICAgKiBOYW1lZCBtYXN0ZXIgbGlzdHMga2V5ZWQgYnkgbGlzdCBuYW1lLCBmb3IgZmllbGRzIHRoYXQgc2V0IGBsaXN0TmFtZWAuXG4gICAqIEVhY2ggbWF5IGJlIHRoZSB2YWx1ZXMgdGhlbXNlbHZlcyAoYXJyYXkvUHJvbWlzZS9PYnNlcnZhYmxlKSBvciBhIGxvYWRlciBmdW5jdGlvbiDigJQgcHJlZmVyXG4gICAqIGEgbG9hZGVyIGZvciBhbnl0aGluZyBmZXRjaGVkLCBzbyBhbiB1bnVzZWQgbGlzdCBpcyBuZXZlciBsb2FkZWQuXG4gICAqL1xuICBsb29rdXBzPzogUmVjb3JkPHN0cmluZywgTG9va3VwTGlzdFNvdXJjZT47XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgbWVzc2FnZXMgc2hvd24gdW5kZXIgaW52YWxpZCBmaWVsZHMsIGtleWVkIGJ5IEFuZ3VsYXIgZXJyb3Iga2V5LiBBIHZhbHVlIGlzXG4gICAqIGEgc3RyaW5nLCBvciBhIGZ1bmN0aW9uIHJlY2VpdmluZyBgKGxhbmd1YWdlLCBlcnJvcilgIHdoZW4gaXQgbmVlZHMgdGhlIGVycm9yJ3MgZGV0YWlsLlxuICAgKiBVbmxpc3RlZCBrZXlzIGtlZXAgdGhlaXIgRW5nbGlzaCBkZWZhdWx0LlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2VzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgKChsYW5ndWFnZTogc3RyaW5nLCBlcnJvcjogYW55KSA9PiBzdHJpbmcpPjtcbiAgLyoqXG4gICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbnMga2V5ZWQgYnkgbmFtZSwgZm9yIGNoZWNrcyB0aGF0IG5lZWQgYSBzZXJ2ZXIg4oCUIHVuaXF1ZW5lc3MsXG4gICAqIGF2YWlsYWJpbGl0eSwgYSByZW1vdGUgcnVsZS4gTmFtZSB0aGVtIGZyb20gYSBzY2hlbWEgd2l0aFxuICAgKiBgdmFsaWRhdG9yczogeyBjdXN0b21Bc3luYzogWyd1bmlxdWVFbWFpbCddIH1gLlxuICAgKlxuICAgKiBFYWNoIGlzIGFuIEFuZ3VsYXIgYEFzeW5jVmFsaWRhdG9yRm5gOiBpdCByZWNlaXZlcyB0aGUgY29udHJvbCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb3JcbiAgICogT2JzZXJ2YWJsZSBvZiBgVmFsaWRhdGlvbkVycm9ycyB8IG51bGxgLiBUaGUgY29udHJvbCBpcyBgcGVuZGluZ2Agd2hpbGUgaXQgcnVucywgYW5kIHRoZVxuICAgKiBmb3JtIGNhbm5vdCBiZSBzdWJtaXR0ZWQgdW50aWwgZXZlcnkgcGVuZGluZyBjaGVjayBzZXR0bGVzLlxuICAgKi9cbiAgYXN5bmNWYWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqIEN1c3RvbSB2YWxpZGF0b3IgZnVuY3Rpb25zIGtleWVkIGJ5IHZhbGlkYXRvciBuYW1lICovXG4gIHZhbGlkYXRvcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogSG9vayBmdW5jdGlvbnMga2V5ZWQgYnkgaG9vayBuYW1lICovXG4gIGhvb2tzPzogUmVjb3JkPHN0cmluZywgSG9va0ZuPjtcbiAgLyoqXG4gICAqIE9yZGVyZWQgc3RlcHMgdGhhdCB1cGdyYWRlIGEgc2F2ZWQgcmVjb3JkIHdoZW4gYEVudGl0eUZvcm1Db25maWcudmVyc2lvbmAgbW92ZXMgYWhlYWRcbiAgICogb2YgdGhlIHJlY29yZCdzIGBfY29uZmlnVmVyc2lvbmAuIEFwcGxpZWQgdG8gYGluaXRpYWxEYXRhYCBiZWZvcmUgdGhlIGZvcm0gaXMgcGF0Y2hlZC5cbiAgICovXG4gIG1pZ3JhdGlvbnM/OiBSZWNvcmRNaWdyYXRpb25bXTtcbn1cblxuLyoqXG4gKiBQcm92aWRlciBmdW5jdGlvbiBmb3Igbmd4LWR5bmFtaWMtZW50aXR5LlxuICogQWxsIG9wdGlvbnMgYXJlIG9wdGlvbmFsIOKAlCBjb25zdW1lcnMgcHJvdmlkZSBvbmx5IHdoYXQgdGhleSB1c2UgKElTUCkuXG4gKlxuICogVXNhZ2UgaW4gYXBwLmNvbmZpZy50czpcbiAqICAgcHJvdmlkZU5neER5bmFtaWNFbnRpdHkoe1xuICogICAgIG1hc2tlZFJvbGVzOiBbJ0lUX1NVUFBPUlQnXSxcbiAqICAgICBlbnRpdHlSZWZzOiB7IGNsaWVudHM6ICgpID0+IGNsaWVudFNlcnZpY2UuZ2V0T3B0aW9ucygpIH0sXG4gKiAgIH0pXG4gKi9cbmV4cG9ydCBjb25zdCBwcm92aWRlTmd4RHluYW1pY0VudGl0eSA9IChjb25maWc6IE5neER5bmFtaWNFbnRpdHlDb25maWcgPSB7fSk6IEVudmlyb25tZW50UHJvdmlkZXJzID0+XG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgeyBwcm92aWRlOiBNQVNLRURfUk9MRVMsIHVzZVZhbHVlOiBjb25maWcubWFza2VkUm9sZXMgPz8gW10gfSxcbiAgICB7IHByb3ZpZGU6IEZJRUxEX1RZUEVfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5maWVsZFR5cGVzID8/IHt9KSkgfSxcbiAgICB7IHByb3ZpZGU6IEVOVElUWV9SRUZfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5lbnRpdHlSZWZzID8/IHt9KSkgfSxcbiAgICB7IHByb3ZpZGU6IExPT0tVUF9SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmxvb2t1cHMgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogVkFMSURBVE9SX1JFR0lTVFJZLCB1c2VWYWx1ZTogbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcudmFsaWRhdG9ycyA/PyB7fSkpIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQVNZTkNfVkFMSURBVE9SX1JFR0lTVFJZLFxuICAgICAgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmFzeW5jVmFsaWRhdG9ycyA/PyB7fSkpLFxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBIT09LX1JFR0lTVFJZLCB1c2VWYWx1ZTogbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcuaG9va3MgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogUkVDT1JEX01JR1JBVElPTlMsIHVzZVZhbHVlOiBjb25maWcubWlncmF0aW9ucyA/PyBbXSB9LFxuICAgIHsgcHJvdmlkZTogVkFMSURBVElPTl9NRVNTQUdFUywgdXNlVmFsdWU6IGNvbmZpZy52YWxpZGF0aW9uTWVzc2FnZXMgPz8ge30gfSxcbiAgXSk7XG4iXX0=
@@ -6,7 +6,7 @@ import * as i0 from "@angular/core";
6
6
  /**
7
7
  * CascadeDataService — loads entity-reference options and applies parent→child cascades.
8
8
  *
9
- * Loaders come from the registry only (ADR-006). This service owns the three things a
9
+ * Loaders come from the registry only. This service owns the three things a
10
10
  * field component should not: resolving the loader, coercing whatever it returned
11
11
  * (array | Promise | Observable) into a Promise, and filtering by the parent's value.
12
12
  */
@@ -126,4 +126,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
126
126
  type: Injectable,
127
127
  args: [{ providedIn: 'root' }]
128
128
  }] });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzY2FkZS1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2Nhc2NhZGUtZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVwRTs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osUUFBUSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVDLFVBQVUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUU3RCw4RkFBOEY7SUFDN0UsUUFBUSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBRTdELCtFQUErRTtJQUMvRSxZQUFZLENBQUMsS0FBd0I7UUFDbkMsT0FBTyxLQUFLLENBQUMsZUFBZSxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxxREFBcUQ7SUFDckQsT0FBTyxDQUFDLEtBQXdCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLEtBQXdCLEVBQ3hCLE1BQThCLEVBQUU7UUFFaEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFP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TUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO3dHQXBJVSxrQkFBa0I7NEdBQWxCLGtCQUFrQixjQURMLE1BQU07OzRGQUNuQixrQkFBa0I7a0JBRDlCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEVudGl0eUZvcm1Db25maWcsXG4gIE5lc3RlZEZpZWxkQ29uZmlnLFxuICBOZXN0ZWRUYWJDb25maWcsXG4gIFJlZmVyZW5jZUxvYWRlckNvbnRleHQsXG4gIFJlZmVyZW5jZU9wdGlvbixcbn0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgYXBwbHlDYXNjYWRlRmlsdGVyIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgRW50aXR5UmVmUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSAnLi9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRW50aXR5UmVmZXJlbmNlU2VydmljZSB9IGZyb20gJy4vZW50aXR5LXJlZmVyZW5jZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBDYXNjYWRlRGF0YVNlcnZpY2Ug4oCUIGxvYWRzIGVudGl0eS1yZWZlcmVuY2Ugb3B0aW9ucyBhbmQgYXBwbGllcyBwYXJlbnTihpJjaGlsZCBjYXNjYWRlcy5cbiAqXG4gKiBMb2FkZXJzIGNvbWUgZnJvbSB0aGUgcmVnaXN0cnkgb25seSAoQURSLTAwNikuIFRoaXMgc2VydmljZSBvd25zIHRoZSB0aHJlZSB0aGluZ3MgYVxuICogZmllbGQgY29tcG9uZW50IHNob3VsZCBub3Q6IHJlc29sdmluZyB0aGUgbG9hZGVyLCBjb2VyY2luZyB3aGF0ZXZlciBpdCByZXR1cm5lZFxuICogKGFycmF5IHwgUHJvbWlzZSB8IE9ic2VydmFibGUpIGludG8gYSBQcm9taXNlLCBhbmQgZmlsdGVyaW5nIGJ5IHRoZSBwYXJlbnQncyB2YWx1ZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBDYXNjYWRlRGF0YVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gaW5qZWN0KEVudGl0eVJlZlJlZ2lzdHJ5U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmZXJlbmNlcyA9IGluamVjdChFbnRpdHlSZWZlcmVuY2VTZXJ2aWNlKTtcblxuICAvKiogUHJlbG9hZCBydW5zIGJ5IGZvcm1Db25maWdJZCwgc28gYSBzZWNvbmQgY2FsbCBqb2lucyB0aGUgZmlyc3QgcmF0aGVyIHRoYW4gcmUtZmV0Y2hpbmcuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlbG9hZHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcblxuICAvKiogUmVnaXN0cnkga2V5IGZvciBhIGZpZWxkOiBleHBsaWNpdCBgbGlua2VkRW50aXR5S2V5YCwgZWxzZSB0aGUgZmllbGQgaWQuICovXG4gIGVudGl0eUtleUZvcihmaWVsZDogTmVzdGVkRmllbGRDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZC5lbnRpdHlSZWZlcmVuY2U/LmxpbmtlZEVudGl0eUtleSA/PyBmaWVsZC5pZDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgbG9hZGVyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZmllbGQuICovXG4gIGNhbkxvYWQoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuaGFzKHRoaXMuZW50aXR5S2V5Rm9yKGZpZWxkKSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgb3B0aW9ucyBmb3IgYSBmaWVsZCwgY2FzY2FkZS1maWx0ZXJlZCBhZ2FpbnN0IGBwYXJlbnRWYWx1ZWAuXG4gICAqIFJldHVybnMgYFtdYCB3aGVuIG5vIGxvYWRlciBpcyByZWdpc3RlcmVkLCBvciB3aGVuIGEgY2FzY2FkZSBjaGlsZCBoYXMgbm8gcGFyZW50IHZhbHVlIHlldC5cbiAgICovXG4gIGFzeW5jIGxvYWQoXG4gICAgZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLFxuICAgIGN0eDogUmVmZXJlbmNlTG9hZGVyQ29udGV4dCA9IHt9LFxuICApOiBQcm9taXNlPFJlZmVyZW5jZU9wdGlvbltdPiB7XG4gICAgY29uc3QgY2ZnID0gZmllbGQuZW50aXR5UmVmZXJlbmNlO1xuICAgIGlmICghdGhpcy5jYW5Mb2FkKGZpZWxkKSkgcmV0dXJuIFtdO1xuXG4gICAgLy8gQSBjYXNjYWRlIGNoaWxkIHdpdGggbm8gcGFyZW50IHNlbGVjdGlvbiBtdXN0IG9mZmVyIG5vdGhpbmcuXG4gICAgY29uc3QgaGFzUGFyZW50VmFsdWUgPVxuICAgICAgY3R4LnBhcmVudFZhbHVlICE9PSBudWxsICYmIGN0eC5wYXJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGN0eC5wYXJlbnRWYWx1ZSAhPT0gJyc7XG4gICAgaWYgKGNmZz8ucGFyZW50RmllbGQgJiYgIWhhc1BhcmVudFZhbHVlKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBsYW5nID0gY3R4LmxhbmcgPz8gJ2VuJztcblxuICAgIC8vIFdoZW4gdGhlIGNhc2NhZGUgY2FuIGJlIHJlc29sdmVkIGxvY2FsbHkgKGBsb29rdXBGaWx0ZXJgL2Bsb29rdXBQYXRoYCksIGZldGNoIHRoZVxuICAgIC8vIHVuZmlsdGVyZWQgc2V0IG9uY2UgYW5kIGZpbHRlciBwZXIgcGFyZW50IGJlbG93IOKAlCBzd2l0Y2hpbmcgcGFyZW50IHRoZW4gY29zdHMgbm90aGluZy5cbiAgICAvLyBPdGhlcndpc2UgdGhlIGxvYWRlciBpcyB0aGUgb25seSB0aGluZyB0aGF0IGNhbiBuYXJyb3cgdGhlIGxpc3QsIHNvIGBwYXJlbnRWYWx1ZWAgaXNcbiAgICAvLyBwYXNzZWQgdGhyb3VnaCBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjYWNoZSBpZGVudGl0eSAob25lIGVudHJ5IHBlciBwYXJlbnQpLlxuICAgIGNvbnN0IGZpbHRlcnNMb2NhbGx5ID0gISEoY2ZnPy5sb29rdXBGaWx0ZXIgfHwgY2ZnPy5sb29rdXBQYXRoKTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZXMubG9hZCh0aGlzLmVudGl0eUtleUZvcihmaWVsZCksIHtcbiAgICAgIC4uLmN0eCxcbiAgICAgIHBhcmVudFZhbHVlOiBmaWx0ZXJzTG9jYWxseSA/IHVuZGVmaW5lZCA6IGN0eC5wYXJlbnRWYWx1ZSxcbiAgICAgIGZpbHRlcnM6IHsgLi4uKGNmZz8uZmlsdGVycyA/PyB7fSksIC4uLihjdHguZmlsdGVycyA/PyB7fSkgfSxcbiAgICAgIGRpc3BsYXlGaWVsZHM6IGNmZz8uZGlzcGxheUZpZWxkcyxcbiAgICAgIGxhbmcsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXBwbHlDYXNjYWRlRmlsdGVyKG9wdGlvbnMsIGN0eC5wYXJlbnRWYWx1ZSwgY2ZnLCBsYW5nKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQcmVsb2FkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBXYXJtIHRoZSBjYWNoZSBmb3IgZXZlcnkgZW50aXR5IGEgY29uZmlnJ3MgY2FzY2FkZXMgZGVwZW5kIG9uLCBzbyBjaGFuZ2luZyBhIHBhcmVudFxuICAgKiByZXNvbHZlcyBmcm9tIG1lbW9yeSBpbnN0ZWFkIG9mIGEgcm91bmQtdHJpcC5cbiAgICpcbiAgICogSWRlbXBvdGVudCBwZXIgYGZvcm1Db25maWdJZGA6IGNhbGxpbmcgaXQgYWdhaW4gcmV0dXJucyB0aGUgaW4tZmxpZ2h0IG9yIGNvbXBsZXRlZCBydW5cbiAgICogcmF0aGVyIHRoYW4gcmUtZmV0Y2hpbmcuXG4gICAqL1xuICBpbml0aWFsaXplQ2FzY2FkZURhdGEoZm9ybUNvbmZpZ0lkOiBzdHJpbmcsIGNvbmZpZzogRW50aXR5Rm9ybUNvbmZpZywgbGFuZyA9ICdlbicpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMucHJlbG9hZHMuZ2V0KGZvcm1Db25maWdJZCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG5cbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmNhc2NhZGVGaWVsZHMoY29uZmlnKTtcbiAgICBjb25zdCBydW4gPSBQcm9taXNlLmFsbChcbiAgICAgIGZpZWxkcy5tYXAoZmllbGQgPT5cbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzLmxvYWQodGhpcy5lbnRpdHlLZXlGb3IoZmllbGQpLCB7XG4gICAgICAgICAgZmlsdGVyczogZmllbGQuZW50aXR5UmVmZXJlbmNlPy5maWx0ZXJzLFxuICAgICAgICAgIGRpc3BsYXlGaWVsZHM6IGZpZWxkLmVudGl0eVJlZmVyZW5jZT8uZGlzcGxheUZpZWxkcyxcbiAgICAgICAgICBsYW5nLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKS50aGVuKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICB0aGlzLnByZWxvYWRzLnNldChmb3JtQ29uZmlnSWQsIHJ1bik7XG4gICAgcmV0dXJuIHJ1bjtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlcyB0cnVlIG9uY2UgYGluaXRpYWxpemVDYXNjYWRlRGF0YWAgZm9yIHRoaXMgY29uZmlnIGhhcyBmaW5pc2hlZC4gKi9cbiAgYXN5bmMgd2FpdEZvckRhdGEoZm9ybUNvbmZpZ0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBydW4gPSB0aGlzLnByZWxvYWRzLmdldChmb3JtQ29uZmlnSWQpO1xuICAgIGlmICghcnVuKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgcnVuO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoaWxkIG9wdGlvbnMgZm9yIGEgcGFyZW50IHNlbGVjdGlvbiwgZnJvbSBjYWNoZSBvbmx5IOKAlCBubyBsb2FkIGlzIHRyaWdnZXJlZC5cbiAgICogUmV0dXJucyBgW11gIHdoZW4gdGhlIGVudGl0eSBoYXMgbm90IGJlZW4gcHJlbG9hZGVkLlxuICAgKi9cbiAgZ2V0Q2FjaGVkQ2hpbGRPcHRpb25zKFxuICAgIGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyxcbiAgICBwYXJlbnRWYWx1ZTogdW5rbm93bixcbiAgICBsYW5nID0gJ2VuJyxcbiAgKTogUmVmZXJlbmNlT3B0aW9uW10ge1xuICAgIGNvbnN0IGNmZyA9IGZpZWxkLmVudGl0eVJlZmVyZW5jZTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJlZmVyZW5jZXMucGVlayh0aGlzLmVudGl0eUtleUZvcihmaWVsZCksIHtcbiAgICAgIGZpbHRlcnM6IGNmZz8uZmlsdGVycyxcbiAgICAgIGRpc3BsYXlGaWVsZHM6IGNmZz8uZGlzcGxheUZpZWxkcyxcbiAgICAgIGxhbmcsXG4gICAgfSk7XG4gICAgaWYgKCFjYWNoZWQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXBwbHlDYXNjYWRlRmlsdGVyKGNhY2hlZCwgcGFyZW50VmFsdWUsIGNmZywgbGFuZyk7XG4gIH1cblxuICAvKiogRm9yZ2V0IHRoZSBwcmVsb2FkIGZvciBvbmUgY29uZmlnLiBUaGUgb3B0aW9uIGNhY2hlIGl0c2VsZiBpcyB1bnRvdWNoZWQuICovXG4gIGNsZWFyQ2FjaGUoZm9ybUNvbmZpZ0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByZWxvYWRzLmRlbGV0ZShmb3JtQ29uZmlnSWQpO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGVudGl0eS1yZWYgZmllbGQgaW4gdGhlIGNvbmZpZyB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIGNhc2NhZGUuICovXG4gIHByaXZhdGUgY2FzY2FkZUZpZWxkcyhjb25maWc6IEVudGl0eUZvcm1Db25maWcpOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHtcbiAgICBjb25zdCBmb3VuZDogTmVzdGVkRmllbGRDb25maWdbXSA9IFtdO1xuICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBjZmcgPSBmaWVsZC5lbnRpdHlSZWZlcmVuY2U7XG4gICAgICAgIGlmIChjZmc/LmVuYWJsZWQgJiYgKGNmZy5wYXJlbnRGaWVsZCB8fCBjZmcubG9va3VwUGF0aCB8fCBjZmcubG9va3VwRmlsdGVyKSkge1xuICAgICAgICAgIGZvdW5kLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHdhbGtGaWVsZHMoZmllbGQuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRhYnMgPz8gW10pIHtcbiAgICAgICAgd2Fsa0ZpZWxkcyh0YWIuZmllbGRzKTtcbiAgICAgICAgd2Fsa1RhYnModGFiLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKGNvbmZpZz8udGFicyk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG59XG4iXX0=
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzY2FkZS1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2Nhc2NhZGUtZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVwRTs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osUUFBUSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVDLFVBQVUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUU3RCw4RkFBOEY7SUFDN0UsUUFBUSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBRTdELCtFQUErRTtJQUMvRSxZQUFZLENBQUMsS0FBd0I7UUFDbkMsT0FBTyxLQUFLLENBQUMsZUFBZSxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxxREFBcUQ7SUFDckQsT0FBTyxDQUFDLEtBQXdCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLEtBQXdCLEVBQ3hCLE1BQThCLEVBQUU7UUFFaEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFP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TUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO3dHQXBJVSxrQkFBa0I7NEdBQWxCLGtCQUFrQixjQURMLE1BQU07OzRGQUNuQixrQkFBa0I7a0JBRDlCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEVudGl0eUZvcm1Db25maWcsXG4gIE5lc3RlZEZpZWxkQ29uZmlnLFxuICBOZXN0ZWRUYWJDb25maWcsXG4gIFJlZmVyZW5jZUxvYWRlckNvbnRleHQsXG4gIFJlZmVyZW5jZU9wdGlvbixcbn0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgYXBwbHlDYXNjYWRlRmlsdGVyIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgRW50aXR5UmVmUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSAnLi9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRW50aXR5UmVmZXJlbmNlU2VydmljZSB9IGZyb20gJy4vZW50aXR5LXJlZmVyZW5jZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBDYXNjYWRlRGF0YVNlcnZpY2Ug4oCUIGxvYWRzIGVudGl0eS1yZWZlcmVuY2Ugb3B0aW9ucyBhbmQgYXBwbGllcyBwYXJlbnTihpJjaGlsZCBjYXNjYWRlcy5cbiAqXG4gKiBMb2FkZXJzIGNvbWUgZnJvbSB0aGUgcmVnaXN0cnkgb25seS4gVGhpcyBzZXJ2aWNlIG93bnMgdGhlIHRocmVlIHRoaW5ncyBhXG4gKiBmaWVsZCBjb21wb25lbnQgc2hvdWxkIG5vdDogcmVzb2x2aW5nIHRoZSBsb2FkZXIsIGNvZXJjaW5nIHdoYXRldmVyIGl0IHJldHVybmVkXG4gKiAoYXJyYXkgfCBQcm9taXNlIHwgT2JzZXJ2YWJsZSkgaW50byBhIFByb21pc2UsIGFuZCBmaWx0ZXJpbmcgYnkgdGhlIHBhcmVudCdzIHZhbHVlLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENhc2NhZGVEYXRhU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnkgPSBpbmplY3QoRW50aXR5UmVmUmVnaXN0cnlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWZlcmVuY2VzID0gaW5qZWN0KEVudGl0eVJlZmVyZW5jZVNlcnZpY2UpO1xuXG4gIC8qKiBQcmVsb2FkIHJ1bnMgYnkgZm9ybUNvbmZpZ0lkLCBzbyBhIHNlY29uZCBjYWxsIGpvaW5zIHRoZSBmaXJzdCByYXRoZXIgdGhhbiByZS1mZXRjaGluZy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcmVsb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gIC8qKiBSZWdpc3RyeSBrZXkgZm9yIGEgZmllbGQ6IGV4cGxpY2l0IGBsaW5rZWRFbnRpdHlLZXlgLCBlbHNlIHRoZSBmaWVsZCBpZC4gKi9cbiAgZW50aXR5S2V5Rm9yKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkLmVudGl0eVJlZmVyZW5jZT8ubGlua2VkRW50aXR5S2V5ID8/IGZpZWxkLmlkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSBsb2FkZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZC4gKi9cbiAgY2FuTG9hZChmaWVsZDogTmVzdGVkRmllbGRDb25maWcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5oYXModGhpcy5lbnRpdHlLZXlGb3IoZmllbGQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBvcHRpb25zIGZvciBhIGZpZWxkLCBjYXNjYWRlLWZpbHRlcmVkIGFnYWluc3QgYHBhcmVudFZhbHVlYC5cbiAgICogUmV0dXJucyBgW11gIHdoZW4gbm8gbG9hZGVyIGlzIHJlZ2lzdGVyZWQsIG9yIHdoZW4gYSBjYXNjYWRlIGNoaWxkIGhhcyBubyBwYXJlbnQgdmFsdWUgeWV0LlxuICAgKi9cbiAgYXN5bmMgbG9hZChcbiAgICBmaWVsZDogTmVzdGVkRmllbGRDb25maWcsXG4gICAgY3R4OiBSZWZlcmVuY2VMb2FkZXJDb250ZXh0ID0ge30sXG4gICk6IFByb21pc2U8UmVmZXJlbmNlT3B0aW9uW10+IHtcbiAgICBjb25zdCBjZmcgPSBmaWVsZC5lbnRpdHlSZWZlcmVuY2U7XG4gICAgaWYgKCF0aGlzLmNhbkxvYWQoZmllbGQpKSByZXR1cm4gW107XG5cbiAgICAvLyBBIGNhc2NhZGUgY2hpbGQgd2l0aCBubyBwYXJlbnQgc2VsZWN0aW9uIG11c3Qgb2ZmZXIgbm90aGluZy5cbiAgICBjb25zdCBoYXNQYXJlbnRWYWx1ZSA9XG4gICAgICBjdHgucGFyZW50VmFsdWUgIT09IG51bGwgJiYgY3R4LnBhcmVudFZhbHVlICE9PSB1bmRlZmluZWQgJiYgY3R4LnBhcmVudFZhbHVlICE9PSAnJztcbiAgICBpZiAoY2ZnPy5wYXJlbnRGaWVsZCAmJiAhaGFzUGFyZW50VmFsdWUpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IGxhbmcgPSBjdHgubGFuZyA/PyAnZW4nO1xuXG4gICAgLy8gV2hlbiB0aGUgY2FzY2FkZSBjYW4gYmUgcmVzb2x2ZWQgbG9jYWxseSAoYGxvb2t1cEZpbHRlcmAvYGxvb2t1cFBhdGhgKSwgZmV0Y2ggdGhlXG4gICAgLy8gdW5maWx0ZXJlZCBzZXQgb25jZSBhbmQgZmlsdGVyIHBlciBwYXJlbnQgYmVsb3cg4oCUIHN3aXRjaGluZyBwYXJlbnQgdGhlbiBjb3N0cyBub3RoaW5nLlxuICAgIC8vIE90aGVyd2lzZSB0aGUgbG9hZGVyIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuIG5hcnJvdyB0aGUgbGlzdCwgc28gYHBhcmVudFZhbHVlYCBpc1xuICAgIC8vIHBhc3NlZCB0aHJvdWdoIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNhY2hlIGlkZW50aXR5IChvbmUgZW50cnkgcGVyIHBhcmVudCkuXG4gICAgY29uc3QgZmlsdGVyc0xvY2FsbHkgPSAhIShjZmc/Lmxvb2t1cEZpbHRlciB8fCBjZmc/Lmxvb2t1cFBhdGgpO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMucmVmZXJlbmNlcy5sb2FkKHRoaXMuZW50aXR5S2V5Rm9yKGZpZWxkKSwge1xuICAgICAgLi4uY3R4LFxuICAgICAgcGFyZW50VmFsdWU6IGZpbHRlcnNMb2NhbGx5ID8gdW5kZWZpbmVkIDogY3R4LnBhcmVudFZhbHVlLFxuICAgICAgZmlsdGVyczogeyAuLi4oY2ZnPy5maWx0ZXJzID8/IHt9KSwgLi4uKGN0eC5maWx0ZXJzID8/IHt9KSB9LFxuICAgICAgZGlzcGxheUZpZWxkczogY2ZnPy5kaXNwbGF5RmllbGRzLFxuICAgICAgbGFuZyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhcHBseUNhc2NhZGVGaWx0ZXIob3B0aW9ucywgY3R4LnBhcmVudFZhbHVlLCBjZmcsIGxhbmcpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFByZWxvYWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFdhcm0gdGhlIGNhY2hlIGZvciBldmVyeSBlbnRpdHkgYSBjb25maWcncyBjYXNjYWRlcyBkZXBlbmQgb24sIHNvIGNoYW5naW5nIGEgcGFyZW50XG4gICAqIHJlc29sdmVzIGZyb20gbWVtb3J5IGluc3RlYWQgb2YgYSByb3VuZC10cmlwLlxuICAgKlxuICAgKiBJZGVtcG90ZW50IHBlciBgZm9ybUNvbmZpZ0lkYDogY2FsbGluZyBpdCBhZ2FpbiByZXR1cm5zIHRoZSBpbi1mbGlnaHQgb3IgY29tcGxldGVkIHJ1blxuICAgKiByYXRoZXIgdGhhbiByZS1mZXRjaGluZy5cbiAgICovXG4gIGluaXRpYWxpemVDYXNjYWRlRGF0YShmb3JtQ29uZmlnSWQ6IHN0cmluZywgY29uZmlnOiBFbnRpdHlGb3JtQ29uZmlnLCBsYW5nID0gJ2VuJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wcmVsb2Fkcy5nZXQoZm9ybUNvbmZpZ0lkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuY2FzY2FkZUZpZWxkcyhjb25maWcpO1xuICAgIGNvbnN0IHJ1biA9IFByb21pc2UuYWxsKFxuICAgICAgZmllbGRzLm1hcChmaWVsZCA9PlxuICAgICAgICB0aGlzLnJlZmVyZW5jZXMubG9hZCh0aGlzLmVudGl0eUtleUZvcihmaWVsZCksIHtcbiAgICAgICAgICBmaWx0ZXJzOiBmaWVsZC5lbnRpdHlSZWZlcmVuY2U/LmZpbHRlcnMsXG4gICAgICAgICAgZGlzcGxheUZpZWxkczogZmllbGQuZW50aXR5UmVmZXJlbmNlPy5kaXNwbGF5RmllbGRzLFxuICAgICAgICAgIGxhbmcsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApLnRoZW4oKCkgPT4gdW5kZWZpbmVkKTtcblxuICAgIHRoaXMucHJlbG9hZHMuc2V0KGZvcm1Db25maWdJZCwgcnVuKTtcbiAgICByZXR1cm4gcnVuO1xuICB9XG5cbiAgLyoqIFJlc29sdmVzIHRydWUgb25jZSBgaW5pdGlhbGl6ZUNhc2NhZGVEYXRhYCBmb3IgdGhpcyBjb25maWcgaGFzIGZpbmlzaGVkLiAqL1xuICBhc3luYyB3YWl0Rm9yRGF0YShmb3JtQ29uZmlnSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJ1biA9IHRoaXMucHJlbG9hZHMuZ2V0KGZvcm1Db25maWdJZCk7XG4gICAgaWYgKCFydW4pIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBydW47XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hpbGQgb3B0aW9ucyBmb3IgYSBwYXJlbnQgc2VsZWN0aW9uLCBmcm9tIGNhY2hlIG9ubHkg4oCUIG5vIGxvYWQgaXMgdHJpZ2dlcmVkLlxuICAgKiBSZXR1cm5zIGBbXWAgd2hlbiB0aGUgZW50aXR5IGhhcyBub3QgYmVlbiBwcmVsb2FkZWQuXG4gICAqL1xuICBnZXRDYWNoZWRDaGlsZE9wdGlvbnMoXG4gICAgZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLFxuICAgIHBhcmVudFZhbHVlOiB1bmtub3duLFxuICAgIGxhbmcgPSAnZW4nLFxuICApOiBSZWZlcmVuY2VPcHRpb25bXSB7XG4gICAgY29uc3QgY2ZnID0gZmllbGQuZW50aXR5UmVmZXJlbmNlO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmVmZXJlbmNlcy5wZWVrKHRoaXMuZW50aXR5S2V5Rm9yKGZpZWxkKSwge1xuICAgICAgZmlsdGVyczogY2ZnPy5maWx0ZXJzLFxuICAgICAgZGlzcGxheUZpZWxkczogY2ZnPy5kaXNwbGF5RmllbGRzLFxuICAgICAgbGFuZyxcbiAgICB9KTtcbiAgICBpZiAoIWNhY2hlZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcHBseUNhc2NhZGVGaWx0ZXIoY2FjaGVkLCBwYXJlbnRWYWx1ZSwgY2ZnLCBsYW5nKTtcbiAgfVxuXG4gIC8qKiBGb3JnZXQgdGhlIHByZWxvYWQgZm9yIG9uZSBjb25maWcuIFRoZSBvcHRpb24gY2FjaGUgaXRzZWxmIGlzIHVudG91Y2hlZC4gKi9cbiAgY2xlYXJDYWNoZShmb3JtQ29uZmlnSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHJlbG9hZHMuZGVsZXRlKGZvcm1Db25maWdJZCk7XG4gIH1cblxuICAvKiogRXZlcnkgZW50aXR5LXJlZiBmaWVsZCBpbiB0aGUgY29uZmlnIHRoYXQgcGFydGljaXBhdGVzIGluIGEgY2FzY2FkZS4gKi9cbiAgcHJpdmF0ZSBjYXNjYWRlRmllbGRzKGNvbmZpZzogRW50aXR5Rm9ybUNvbmZpZyk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IGZvdW5kOiBOZXN0ZWRGaWVsZENvbmZpZ1tdID0gW107XG4gICAgY29uc3Qgd2Fsa0ZpZWxkcyA9IChmaWVsZHM6IE5lc3RlZEZpZWxkQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGNmZyA9IGZpZWxkLmVudGl0eVJlZmVyZW5jZTtcbiAgICAgICAgaWYgKGNmZz8uZW5hYmxlZCAmJiAoY2ZnLnBhcmVudEZpZWxkIHx8IGNmZy5sb29rdXBQYXRoIHx8IGNmZy5sb29rdXBGaWx0ZXIpKSB7XG4gICAgICAgICAgZm91bmQucHVzaChmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgICAgd2Fsa0ZpZWxkcyhmaWVsZC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB3YWxrVGFicyA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0YWIgb2YgdGFicyA/PyBbXSkge1xuICAgICAgICB3YWxrRmllbGRzKHRhYi5maWVsZHMpO1xuICAgICAgICB3YWxrVGFicyh0YWIuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsa1RhYnMoY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cbn1cbiJdfQ==
@@ -3,7 +3,7 @@ import { ENTITY_REF_REGISTRY } from '../tokens/injection-tokens';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
5
  * EntityRefRegistryService — resolves entity-ref option loader functions.
6
- * ADR-006: Entity-ref options come ONLY from this registry.
6
+ * Entity-ref options come ONLY from this registry.
7
7
  * Never pass loaders via @Input() on field components.
8
8
  *
9
9
  * Consumers register loaders via provideNgxDynamicEntity({ entityRefs: { clients: () => [...] } }).
@@ -28,4 +28,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
28
28
  type: Injectable,
29
29
  args: [{ providedIn: 'root' }]
30
30
  }] });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1yZWdpc3RyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRWpFOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2xCLFFBQVEsR0FDdkIsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFOUY7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLFNBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFRCxHQUFHLENBQUMsU0FBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO3dHQWRVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCLGNBRFgsTUFBTTs7NEZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgRW50aXR5UmVmZXJlbmNlTG9hZGVyIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgRU5USVRZX1JFRl9SRUdJU1RSWSB9IGZyb20gJy4uL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcblxuLyoqXG4gKiBFbnRpdHlSZWZSZWdpc3RyeVNlcnZpY2Ug4oCUIHJlc29sdmVzIGVudGl0eS1yZWYgb3B0aW9uIGxvYWRlciBmdW5jdGlvbnMuXG4gKiBBRFItMDA2OiBFbnRpdHktcmVmIG9wdGlvbnMgY29tZSBPTkxZIGZyb20gdGhpcyByZWdpc3RyeS5cbiAqIE5ldmVyIHBhc3MgbG9hZGVycyB2aWEgQElucHV0KCkgb24gZmllbGQgY29tcG9uZW50cy5cbiAqXG4gKiBDb25zdW1lcnMgcmVnaXN0ZXIgbG9hZGVycyB2aWEgcHJvdmlkZU5neER5bmFtaWNFbnRpdHkoeyBlbnRpdHlSZWZzOiB7IGNsaWVudHM6ICgpID0+IFsuLi5dIH0gfSkuXG4gKiBFbnRpdHlSZWZGaWVsZENvbXBvbmVudCBpbmplY3RzIHRoaXMgc2VydmljZSBhbmQgY2FsbHMgcmVzb2x2ZShmaWVsZC5jb21wb25lbnQgPz8gZmllbGQuaWQpLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEVudGl0eVJlZlJlZ2lzdHJ5U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnkgPVxuICAgIGluamVjdChFTlRJVFlfUkVGX1JFR0lTVFJZLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBNYXA8c3RyaW5nLCBFbnRpdHlSZWZlcmVuY2VMb2FkZXI+KCk7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIGxvYWRlciBmb3IgYW4gZW50aXR5IGtleS5cbiAgICogQHJldHVybnMgVGhlIGxvYWRlciwgb3IgbnVsbCBpZiBub25lIGlzIHJlZ2lzdGVyZWQuXG4gICAqL1xuICByZXNvbHZlKGVudGl0eUtleTogc3RyaW5nKTogRW50aXR5UmVmZXJlbmNlTG9hZGVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0KGVudGl0eUtleSkgPz8gbnVsbDtcbiAgfVxuXG4gIGhhcyhlbnRpdHlLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmhhcyhlbnRpdHlLZXkpO1xuICB9XG59XG4iXX0=
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1yZWdpc3RyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRWpFOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2xCLFFBQVEsR0FDdkIsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFOUY7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLFNBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFRCxHQUFHLENBQUMsU0FBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO3dHQWRVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCLGNBRFgsTUFBTTs7NEZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgRW50aXR5UmVmZXJlbmNlTG9hZGVyIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgRU5USVRZX1JFRl9SRUdJU1RSWSB9IGZyb20gJy4uL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcblxuLyoqXG4gKiBFbnRpdHlSZWZSZWdpc3RyeVNlcnZpY2Ug4oCUIHJlc29sdmVzIGVudGl0eS1yZWYgb3B0aW9uIGxvYWRlciBmdW5jdGlvbnMuXG4gKiBFbnRpdHktcmVmIG9wdGlvbnMgY29tZSBPTkxZIGZyb20gdGhpcyByZWdpc3RyeS5cbiAqIE5ldmVyIHBhc3MgbG9hZGVycyB2aWEgQElucHV0KCkgb24gZmllbGQgY29tcG9uZW50cy5cbiAqXG4gKiBDb25zdW1lcnMgcmVnaXN0ZXIgbG9hZGVycyB2aWEgcHJvdmlkZU5neER5bmFtaWNFbnRpdHkoeyBlbnRpdHlSZWZzOiB7IGNsaWVudHM6ICgpID0+IFsuLi5dIH0gfSkuXG4gKiBFbnRpdHlSZWZGaWVsZENvbXBvbmVudCBpbmplY3RzIHRoaXMgc2VydmljZSBhbmQgY2FsbHMgcmVzb2x2ZShmaWVsZC5jb21wb25lbnQgPz8gZmllbGQuaWQpLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEVudGl0eVJlZlJlZ2lzdHJ5U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnkgPVxuICAgIGluamVjdChFTlRJVFlfUkVGX1JFR0lTVFJZLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBNYXA8c3RyaW5nLCBFbnRpdHlSZWZlcmVuY2VMb2FkZXI+KCk7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIGxvYWRlciBmb3IgYW4gZW50aXR5IGtleS5cbiAgICogQHJldHVybnMgVGhlIGxvYWRlciwgb3IgbnVsbCBpZiBub25lIGlzIHJlZ2lzdGVyZWQuXG4gICAqL1xuICByZXNvbHZlKGVudGl0eUtleTogc3RyaW5nKTogRW50aXR5UmVmZXJlbmNlTG9hZGVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0KGVudGl0eUtleSkgPz8gbnVsbDtcbiAgfVxuXG4gIGhhcyhlbnRpdHlLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmhhcyhlbnRpdHlLZXkpO1xuICB9XG59XG4iXX0=