@vendure/admin-ui 1.5.2 → 1.6.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 (116) hide show
  1. package/bundles/vendure-admin-ui-catalog.umd.js +206 -172
  2. package/bundles/vendure-admin-ui-catalog.umd.js.map +1 -1
  3. package/bundles/vendure-admin-ui-core.umd.js +2333 -1860
  4. package/bundles/vendure-admin-ui-core.umd.js.map +1 -1
  5. package/bundles/vendure-admin-ui-dashboard.umd.js +2 -2
  6. package/bundles/vendure-admin-ui-login.umd.js +2 -2
  7. package/bundles/vendure-admin-ui-login.umd.js.map +1 -1
  8. package/bundles/vendure-admin-ui-marketing.umd.js +1 -1
  9. package/bundles/vendure-admin-ui-marketing.umd.js.map +1 -1
  10. package/bundles/vendure-admin-ui-order.umd.js +1 -1
  11. package/bundles/vendure-admin-ui-order.umd.js.map +1 -1
  12. package/catalog/components/collection-contents/collection-contents.component.d.ts +7 -2
  13. package/catalog/components/collection-detail/collection-detail.component.d.ts +12 -4
  14. package/catalog/components/collection-list/collection-list.component.d.ts +2 -0
  15. package/catalog/components/collection-tree/array-to-tree.d.ts +1 -1
  16. package/catalog/components/collection-tree/collection-tree-node.component.d.ts +5 -1
  17. package/catalog/components/collection-tree/collection-tree.component.d.ts +1 -0
  18. package/catalog/providers/product-detail/product-detail.service.d.ts +2 -2
  19. package/catalog/public_api.d.ts +0 -1
  20. package/catalog/vendure-admin-ui-catalog.metadata.json +1 -1
  21. package/core/common/generated-types.d.ts +32 -3
  22. package/core/common/utilities/selection-manager.d.ts +23 -0
  23. package/core/common/version.d.ts +1 -1
  24. package/core/components/app-shell/app-shell.component.d.ts +1 -0
  25. package/core/data/definitions/collection-definitions.d.ts +1 -0
  26. package/core/data/providers/collection-data.service.d.ts +6 -2
  27. package/core/providers/local-storage/local-storage.service.d.ts +1 -0
  28. package/core/public_api.d.ts +5 -0
  29. package/core/shared/components/asset-gallery/asset-gallery.component.d.ts +21 -6
  30. package/core/shared/components/configurable-input/configurable-input.component.d.ts +7 -2
  31. package/core/shared/components/product-multi-selector-dialog/product-multi-selector-dialog.component.d.ts +35 -0
  32. package/{catalog → core/shared}/components/product-search-input/product-search-input.component.d.ts +1 -1
  33. package/core/shared/components/select-toggle/select-toggle.component.d.ts +1 -0
  34. package/core/shared/dynamic-form-inputs/combination-mode-form-input/combination-mode-form-input.component.d.ts +25 -0
  35. package/core/shared/dynamic-form-inputs/product-multi-selector-form-input/product-multi-selector-form-input.component.d.ts +20 -0
  36. package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +3 -1
  37. package/core/shared/dynamic-form-inputs/relation-form-input/asset/relation-asset-input.component.d.ts +5 -2
  38. package/core/vendure-admin-ui-core.metadata.json +1 -1
  39. package/dashboard/vendure-admin-ui-dashboard.metadata.json +1 -1
  40. package/esm2015/catalog/catalog.module.js +1 -3
  41. package/esm2015/catalog/components/assets/assets.component.js +1 -1
  42. package/esm2015/catalog/components/collection-contents/collection-contents.component.js +51 -14
  43. package/esm2015/catalog/components/collection-detail/collection-detail.component.js +67 -29
  44. package/esm2015/catalog/components/collection-list/collection-list.component.js +30 -4
  45. package/esm2015/catalog/components/collection-tree/array-to-tree.js +3 -3
  46. package/esm2015/catalog/components/collection-tree/collection-tree-node.component.js +27 -4
  47. package/esm2015/catalog/components/collection-tree/collection-tree.component.js +4 -2
  48. package/esm2015/catalog/components/product-detail/product-detail.component.js +1 -1
  49. package/esm2015/catalog/components/product-list/product-list.component.js +3 -3
  50. package/esm2015/catalog/components/product-variants-list/product-variants-list.component.js +1 -1
  51. package/esm2015/catalog/public_api.js +1 -2
  52. package/esm2015/core/app.component.module.js +1 -1
  53. package/esm2015/core/common/base-detail.component.js +1 -1
  54. package/esm2015/core/common/deactivate-aware.js +1 -1
  55. package/esm2015/core/common/generated-types.js +1 -1
  56. package/esm2015/core/common/introspection-result.js +255 -189
  57. package/esm2015/core/common/utilities/selection-manager.js +64 -0
  58. package/esm2015/core/common/version.js +2 -2
  59. package/esm2015/core/components/app-shell/app-shell.component.js +4 -3
  60. package/esm2015/core/core.module.js +1 -1
  61. package/esm2015/core/data/definitions/collection-definitions.js +18 -1
  62. package/esm2015/core/data/definitions/order-definitions.js +2 -1
  63. package/esm2015/core/data/definitions/shared-definitions.js +29 -28
  64. package/esm2015/core/data/providers/collection-data.service.js +5 -2
  65. package/esm2015/core/providers/local-storage/local-storage.service.js +1 -1
  66. package/esm2015/core/public_api.js +6 -1
  67. package/esm2015/core/shared/components/asset-gallery/asset-gallery.component.js +24 -42
  68. package/esm2015/core/shared/components/configurable-input/configurable-input.component.js +13 -3
  69. package/esm2015/core/shared/components/help-tooltip/help-tooltip.component.js +1 -1
  70. package/esm2015/core/shared/components/product-multi-selector-dialog/product-multi-selector-dialog.component.js +129 -0
  71. package/esm2015/core/shared/components/product-search-input/product-search-input.component.js +104 -0
  72. package/esm2015/core/shared/components/rich-text-editor/rich-text-editor.component.js +1 -1
  73. package/esm2015/core/shared/components/select-toggle/select-toggle.component.js +5 -3
  74. package/esm2015/core/shared/dynamic-form-inputs/combination-mode-form-input/combination-mode-form-input.component.js +45 -0
  75. package/esm2015/core/shared/dynamic-form-inputs/product-multi-selector-form-input/product-multi-selector-form-input.component.js +53 -0
  76. package/esm2015/core/shared/dynamic-form-inputs/register-dynamic-input-components.js +5 -1
  77. package/esm2015/core/shared/dynamic-form-inputs/relation-form-input/asset/relation-asset-input.component.js +8 -7
  78. package/esm2015/core/shared/shared.module.js +9 -1
  79. package/esm2015/dashboard/components/dashboard/dashboard.component.js +1 -1
  80. package/esm2015/dashboard/widgets/order-summary-widget/order-summary-widget.component.js +1 -1
  81. package/esm2015/login/components/login/login.component.js +3 -3
  82. package/esm2015/marketing/components/promotion-detail/promotion-detail.component.js +2 -2
  83. package/esm2015/order/components/order-list/order-list.component.js +2 -2
  84. package/fesm2015/vendure-admin-ui-catalog.js +181 -157
  85. package/fesm2015/vendure-admin-ui-catalog.js.map +1 -1
  86. package/fesm2015/vendure-admin-ui-core.js +2156 -1691
  87. package/fesm2015/vendure-admin-ui-core.js.map +1 -1
  88. package/fesm2015/vendure-admin-ui-dashboard.js +2 -2
  89. package/fesm2015/vendure-admin-ui-login.js +2 -2
  90. package/fesm2015/vendure-admin-ui-login.js.map +1 -1
  91. package/fesm2015/vendure-admin-ui-marketing.js +1 -1
  92. package/fesm2015/vendure-admin-ui-marketing.js.map +1 -1
  93. package/fesm2015/vendure-admin-ui-order.js +1 -1
  94. package/fesm2015/vendure-admin-ui-order.js.map +1 -1
  95. package/login/vendure-admin-ui-login.metadata.json +1 -1
  96. package/marketing/vendure-admin-ui-marketing.metadata.json +1 -1
  97. package/order/vendure-admin-ui-order.metadata.json +1 -1
  98. package/package.json +2 -2
  99. package/static/i18n-messages/cs.json +9 -0
  100. package/static/i18n-messages/de.json +9 -0
  101. package/static/i18n-messages/en.json +10 -1
  102. package/static/i18n-messages/es.json +9 -0
  103. package/static/i18n-messages/fr.json +9 -0
  104. package/static/i18n-messages/it.json +9 -0
  105. package/static/i18n-messages/pl.json +9 -0
  106. package/static/i18n-messages/pt_BR.json +9 -0
  107. package/static/i18n-messages/pt_PT.json +9 -0
  108. package/static/i18n-messages/ru.json +9 -0
  109. package/static/i18n-messages/uk.json +9 -0
  110. package/static/i18n-messages/zh_Hans.json +9 -0
  111. package/static/i18n-messages/zh_Hant.json +9 -0
  112. package/static/styles/global/_forms.scss +4 -5
  113. package/static/styles/global/_overrides.scss +5 -1
  114. package/static/styles/theme/default.scss +13 -1
  115. package/static/theme.min.css +1 -1
  116. package/esm2015/catalog/components/product-search-input/product-search-input.component.js +0 -104
@@ -173,7 +173,7 @@ export class OrderListComponent extends BaseListComponent {
173
173
  OrderListComponent.decorators = [
174
174
  { type: Component, args: [{
175
175
  selector: 'vdr-order-list',
176
- template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchOrderCodeControl\"\r\n [placeholder]=\"'order.search-by-order-code' | translate\"\r\n class=\"search-input\"\r\n />\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchLastNameControl\"\r\n [placeholder]=\"'order.search-by-customer-last-name' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.total | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n",
176
+ template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchOrderCodeControl\"\r\n [placeholder]=\"'order.search-by-order-code' | translate\"\r\n class=\"search-input\"\r\n />\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchLastNameControl\"\r\n [placeholder]=\"'order.search-by-customer-last-name' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n",
177
177
  changeDetection: ChangeDetectionStrategy.OnPush,
178
178
  styles: [".search-form{display:flex;flex-direction:column;align-items:baseline;width:100%;margin-bottom:6px}@media screen and (min-width: 768px){.search-form{flex-direction:row}}.search-input{margin-left:6px;margin-top:6px;min-width:300px}.custom-filters{overflow:hidden;max-height:0;padding-bottom:6px}.custom-filters.expanded{max-height:initial}.custom-filters>form{display:flex;flex-direction:column;align-items:center}.custom-filters>form>div{width:100%}ng-select{flex:1;min-width:200px;height:36px}ng-select ::ng-deep .ng-select-container{height:36px}\n"]
179
179
  },] }
@@ -185,4 +185,4 @@ OrderListComponent.ctorParameters = () => [
185
185
  { type: Router },
186
186
  { type: ActivatedRoute }
187
187
  ];
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL29yZGVyL3NyYy9jb21wb25lbnRzL29yZGVyLWxpc3Qvb3JkZXItbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFdBQVcsRUFFWCxtQkFBbUIsRUFFbkIsbUJBQW1CLEVBQ25CLFNBQVMsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFRLFNBQVMsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBbUJ2RyxNQUFNLE9BQU8sa0JBQ1QsU0FBUSxpQkFBeUQ7SUEyQ2pFLFlBQ1ksbUJBQXdDLEVBQ3hDLFdBQXdCLEVBQ3hCLG1CQUF3QyxFQUNoRCxNQUFjLEVBQ2QsS0FBcUI7UUFFckIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQU5iLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQTVDcEQsMkJBQXNCLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsMEJBQXFC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RSxzQkFBc0I7YUFDbkMsQ0FBQztTQUNMO1FBQ0QsSUFBSSxtQkFBbUIsRUFBRTtZQUNyQixNQUFNLENBQUMsSUFBSSxHQUFHO2dCQUNWLFFBQVEsRUFBRSxtQkFBbUI7YUFDaEMsQ0FBQztTQUNMO1FBQ0QsT0FBTztZQUNILE9BQU8sRUFBRTtnQkFDTCxJQUFJO2dCQUNKLElBQUk7Z0JBQ0osTUFBTSxvQkFDQyxDQUFDLE1BQU0sYUFBTixNQUFNLGNBQU4sTUFBTSxHQUFJLEVBQUUsQ0FBQyxDQUNwQjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0YsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJO2lCQUM1QjthQUNKO1NBQ0osQ0FBQztJQUNOLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFZO1FBQ3pCLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9GO2FBQU07WUFDSCxPQUFPLEVBQUUsQ0FBQztTQUNiO0lBQ0wsQ0FBQzs7O1lBck5KLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixzM0xBQTBDO2dCQUUxQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDbEQ7OztZQXZCRyxtQkFBbUI7WUFKbkIsV0FBVztZQUVYLG1CQUFtQjtZQU5FLE1BQU07WUFBdEIsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgbWFya2VyIGFzIF8gfSBmcm9tICdAYmllc2JqZXJnL25neC10cmFuc2xhdGUtZXh0cmFjdC1tYXJrZXInO1xyXG5pbXBvcnQge1xyXG4gICAgQmFzZUxpc3RDb21wb25lbnQsXHJcbiAgICBEYXRhU2VydmljZSxcclxuICAgIEdldE9yZGVyTGlzdCxcclxuICAgIExvY2FsU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBPcmRlckxpc3RPcHRpb25zLFxyXG4gICAgU2VydmVyQ29uZmlnU2VydmljZSxcclxuICAgIFNvcnRPcmRlcixcclxufSBmcm9tICdAdmVuZHVyZS9hZG1pbi11aS9jb3JlJztcclxuaW1wb3J0IHsgT3JkZXIgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL2dlbmVyYXRlZC10eXBlcyc7XHJcbmltcG9ydCB7IG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBza2lwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmludGVyZmFjZSBPcmRlckZpbHRlckNvbmZpZyB7XHJcbiAgICBhY3RpdmU/OiBib29sZWFuO1xyXG4gICAgc3RhdGVzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBGaWx0ZXJQcmVzZXQge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIGNvbmZpZzogT3JkZXJGaWx0ZXJDb25maWc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd2ZHItb3JkZXItbGlzdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vb3JkZXItbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9vcmRlci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyTGlzdENvbXBvbmVudFxyXG4gICAgZXh0ZW5kcyBCYXNlTGlzdENvbXBvbmVudDxHZXRPcmRlckxpc3QuUXVlcnksIEdldE9yZGVyTGlzdC5JdGVtcz5cclxuICAgIGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIHNlYXJjaE9yZGVyQ29kZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xyXG4gICAgc2VhcmNoTGFzdE5hbWVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgIGN1c3RvbUZpbHRlckZvcm06IEZvcm1Hcm91cDtcclxuICAgIG9yZGVyU3RhdGVzID0gdGhpcy5zZXJ2ZXJDb25maWdTZXJ2aWNlLmdldE9yZGVyUHJvY2Vzc1N0YXRlcygpLm1hcChpdGVtID0+IGl0ZW0ubmFtZSk7XHJcbiAgICBmaWx0ZXJQcmVzZXRzOiBGaWx0ZXJQcmVzZXRbXSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdvcGVuJyxcclxuICAgICAgICAgICAgbGFiZWw6IF8oJ29yZGVyLmZpbHRlci1wcmVzZXQtb3BlbicpLFxyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZXM6IHRoaXMub3JkZXJTdGF0ZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgIHMgPT4gcyAhPT0gJ0RlbGl2ZXJlZCcgJiYgcyAhPT0gJ0NhbmNlbGxlZCcgJiYgcyAhPT0gJ1NoaXBwZWQnLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3NoaXBwZWQnLFxyXG4gICAgICAgICAgICBsYWJlbDogXygnb3JkZXIuZmlsdGVyLXByZXNldC1zaGlwcGVkJyksXHJcbiAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHN0YXRlczogWydTaGlwcGVkJ10sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdjb21wbGV0ZWQnLFxyXG4gICAgICAgICAgICBsYWJlbDogXygnb3JkZXIuZmlsdGVyLXByZXNldC1jb21wbGV0ZWQnKSxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgc3RhdGVzOiBbJ0RlbGl2ZXJlZCcsICdDYW5jZWxsZWQnXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2FjdGl2ZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiBfKCdvcmRlci5maWx0ZXItcHJlc2V0LWFjdGl2ZScpLFxyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgXTtcclxuICAgIGFjdGl2ZVByZXNldCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHNlcnZlckNvbmZpZ1NlcnZpY2U6IFNlcnZlckNvbmZpZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKHJvdXRlciwgcm91dGUpO1xyXG4gICAgICAgIHN1cGVyLnNldFF1ZXJ5Rm4oXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgICAgICAgICAodGFrZSwgc2tpcCkgPT4gdGhpcy5kYXRhU2VydmljZS5vcmRlci5nZXRPcmRlcnMoeyB0YWtlLCBza2lwIH0pLnJlZmV0Y2hPbkNoYW5uZWxDaGFuZ2UoKSxcclxuICAgICAgICAgICAgZGF0YSA9PiBkYXRhLm9yZGVycyxcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgICAgIChza2lwLCB0YWtlKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVRdWVyeU9wdGlvbnMoXHJcbiAgICAgICAgICAgICAgICAgICAgc2tpcCxcclxuICAgICAgICAgICAgICAgICAgICB0YWtlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoT3JkZXJDb2RlQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaExhc3ROYW1lQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdmaWx0ZXInKSB8fCAnb3BlbicsXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbGFzdEZpbHRlcnMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0KCdvcmRlckxpc3RMYXN0Q3VzdG9tRmlsdGVycycpO1xyXG4gICAgICAgIGlmIChsYXN0RmlsdGVycykge1xyXG4gICAgICAgICAgICB0aGlzLnNldFF1ZXJ5UGFyYW0obGFzdEZpbHRlcnMsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZVByZXNldCQgPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXAucGlwZShcclxuICAgICAgICAgICAgbWFwKHFwbSA9PiBxcG0uZ2V0KCdmaWx0ZXInKSB8fCAnb3BlbicpLFxyXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoVGVybXMkID0gbWVyZ2UoXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoT3JkZXJDb2RlQ29udHJvbC52YWx1ZUNoYW5nZXMsXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoTGFzdE5hbWVDb250cm9sLnZhbHVlQ2hhbmdlcyxcclxuICAgICAgICApLnBpcGUoXHJcbiAgICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiAyIDwgdmFsdWUubGVuZ3RoIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCksXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWVyZ2Uoc2VhcmNoVGVybXMkLCB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXApXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtTWFwID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICBzdGF0ZXM6IG5ldyBGb3JtQ29udHJvbChxdWVyeVBhcmFtTWFwLmdldEFsbCgnc3RhdGVzJykgPz8gW10pLFxyXG4gICAgICAgICAgICBwbGFjZWRBdFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2wocXVlcnlQYXJhbU1hcC5nZXQoJ3BsYWNlZEF0U3RhcnQnKSksXHJcbiAgICAgICAgICAgIHBsYWNlZEF0RW5kOiBuZXcgRm9ybUNvbnRyb2wocXVlcnlQYXJhbU1hcC5nZXQoJ3BsYWNlZEF0RW5kJykpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEZpbHRlclByZXNldChwcmVzZXROYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBsYXN0Q3VzdG9tRmlsdGVycyA9IHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5nZXQoJ29yZGVyTGlzdExhc3RDdXN0b21GaWx0ZXJzJykgPz8ge307XHJcbiAgICAgICAgY29uc3QgZW1wdHlDdXN0b21GaWx0ZXJzID0geyBzdGF0ZXM6IHVuZGVmaW5lZCwgcGxhY2VkQXRTdGFydDogdW5kZWZpbmVkLCBwbGFjZWRBdEVuZDogdW5kZWZpbmVkIH07XHJcbiAgICAgICAgY29uc3QgZmlsdGVycyA9IHByZXNldE5hbWUgPT09ICdjdXN0b20nID8gbGFzdEN1c3RvbUZpbHRlcnMgOiBlbXB0eUN1c3RvbUZpbHRlcnM7XHJcbiAgICAgICAgdGhpcy5zZXRRdWVyeVBhcmFtKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHByZXNldE5hbWUsXHJcbiAgICAgICAgICAgICAgICBwYWdlOiAxLFxyXG4gICAgICAgICAgICAgICAgLi4uZmlsdGVycyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeyByZXBsYWNlVXJsOiB0cnVlIH0sXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUN1c3RvbUZpbHRlcnMoKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5jdXN0b21GaWx0ZXJGb3JtLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUZpbHRlcnMgPSB7XHJcbiAgICAgICAgICAgIHN0YXRlczogZm9ybVZhbHVlLnN0YXRlcyxcclxuICAgICAgICAgICAgcGxhY2VkQXRTdGFydDogZm9ybVZhbHVlLnBsYWNlZEF0U3RhcnQsXHJcbiAgICAgICAgICAgIHBsYWNlZEF0RW5kOiBmb3JtVmFsdWUucGxhY2VkQXRFbmQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNldFF1ZXJ5UGFyYW0oe1xyXG4gICAgICAgICAgICBmaWx0ZXI6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAuLi5jdXN0b21GaWx0ZXJzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyRm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgIHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5zZXQoJ29yZGVyTGlzdExhc3RDdXN0b21GaWx0ZXJzJywgY3VzdG9tRmlsdGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVRdWVyeU9wdGlvbnMoXHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgc2tpcDogbnVtYmVyLFxyXG4gICAgICAgIHRha2U6IG51bWJlcixcclxuICAgICAgICBvcmRlckNvZGVTZWFyY2hUZXJtOiBzdHJpbmcsXHJcbiAgICAgICAgY3VzdG9tZXJOYW1lU2VhcmNoVGVybTogc3RyaW5nLFxyXG4gICAgICAgIGFjdGl2ZUZpbHRlclByZXNldD86IHN0cmluZyxcclxuICAgICk6IHsgb3B0aW9uczogT3JkZXJMaXN0T3B0aW9ucyB9IHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJDb25maWcgPSB0aGlzLmZpbHRlclByZXNldHMuZmluZChwID0+IHAubmFtZSA9PT0gYWN0aXZlRmlsdGVyUHJlc2V0KTtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgICAgICBjb25zdCBmaWx0ZXI6IGFueSA9IHt9O1xyXG4gICAgICAgIGlmIChmaWx0ZXJDb25maWcpIHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckNvbmZpZy5jb25maWcuYWN0aXZlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5hY3RpdmUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXE6IGZpbHRlckNvbmZpZy5jb25maWcuYWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmlsdGVyQ29uZmlnLmNvbmZpZy5zdGF0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBpbjogZmlsdGVyQ29uZmlnLmNvbmZpZy5zdGF0ZXMsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVGaWx0ZXJQcmVzZXQgPT09ICdjdXN0b20nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwO1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0ZXMgPSBxdWVyeVBhcmFtcy5nZXRBbGwoJ3N0YXRlcycpID8/IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZWRBdFN0YXJ0ID0gcXVlcnlQYXJhbXMuZ2V0KCdwbGFjZWRBdFN0YXJ0Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlZEF0RW5kID0gcXVlcnlQYXJhbXMuZ2V0KCdwbGFjZWRBdEVuZCcpO1xyXG4gICAgICAgICAgICBpZiAoc3RhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLnN0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGluOiBzdGF0ZXMsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwbGFjZWRBdFN0YXJ0ICYmIHBsYWNlZEF0RW5kKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIub3JkZXJQbGFjZWRBdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwbGFjZWRBdFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHBsYWNlZEF0RW5kLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBsYWNlZEF0U3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5vcmRlclBsYWNlZEF0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyOiBwbGFjZWRBdFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGFjZWRBdEVuZCkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLm9yZGVyUGxhY2VkQXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBwbGFjZWRBdEVuZCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1c3RvbWVyTmFtZVNlYXJjaFRlcm0pIHtcclxuICAgICAgICAgICAgZmlsdGVyLmN1c3RvbWVyTGFzdE5hbWUgPSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluczogY3VzdG9tZXJOYW1lU2VhcmNoVGVybSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9yZGVyQ29kZVNlYXJjaFRlcm0pIHtcclxuICAgICAgICAgICAgZmlsdGVyLmNvZGUgPSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluczogb3JkZXJDb2RlU2VhcmNoVGVybSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgc2tpcCxcclxuICAgICAgICAgICAgICAgIHRha2UsXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi4oZmlsdGVyID8/IHt9KSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzb3J0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBTb3J0T3JkZXIuREVTQyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTaGlwcGluZ05hbWVzKG9yZGVyOiBPcmRlcikge1xyXG4gICAgICAgIGlmIChvcmRlci5zaGlwcGluZ0xpbmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JkZXIuc2hpcHBpbmdMaW5lcy5tYXAoc2hpcHBpbmdMaW5lID0+IHNoaXBwaW5nTGluZS5zaGlwcGluZ01ldGhvZC5uYW1lKS5qb2luKCcsICcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL29yZGVyL3NyYy9jb21wb25lbnRzL29yZGVyLWxpc3Qvb3JkZXItbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFdBQVcsRUFFWCxtQkFBbUIsRUFFbkIsbUJBQW1CLEVBQ25CLFNBQVMsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFRLFNBQVMsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBbUJ2RyxNQUFNLE9BQU8sa0JBQ1QsU0FBUSxpQkFBeUQ7SUEyQ2pFLFlBQ1ksbUJBQXdDLEVBQ3hDLFdBQXdCLEVBQ3hCLG1CQUF3QyxFQUNoRCxNQUFjLEVBQ2QsS0FBcUI7UUFFckIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQU5iLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQTVDcEQsMkJBQXNCLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsMEJBQXFC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RSxzQkFBc0I7YUFDbkMsQ0FBQztTQUNMO1FBQ0QsSUFBSSxtQkFBbUIsRUFBRTtZQUNyQixNQUFNLENBQUMsSUFBSSxHQUFHO2dCQUNWLFFBQVEsRUFBRSxtQkFBbUI7YUFDaEMsQ0FBQztTQUNMO1FBQ0QsT0FBTztZQUNILE9BQU8sRUFBRTtnQkFDTCxJQUFJO2dCQUNKLElBQUk7Z0JBQ0osTUFBTSxvQkFDQyxDQUFDLE1BQU0sYUFBTixNQUFNLGNBQU4sTUFBTSxHQUFJLEVBQUUsQ0FBQyxDQUNwQjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0YsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJO2lCQUM1QjthQUNKO1NBQ0osQ0FBQztJQUNOLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFZO1FBQ3pCLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9GO2FBQU07WUFDSCxPQUFPLEVBQUUsQ0FBQztTQUNiO0lBQ0wsQ0FBQzs7O1lBck5KLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQiw2M0xBQTBDO2dCQUUxQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDbEQ7OztZQXZCRyxtQkFBbUI7WUFKbkIsV0FBVztZQUVYLG1CQUFtQjtZQU5FLE1BQU07WUFBdEIsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgbWFya2VyIGFzIF8gfSBmcm9tICdAYmllc2JqZXJnL25neC10cmFuc2xhdGUtZXh0cmFjdC1tYXJrZXInO1xyXG5pbXBvcnQge1xyXG4gICAgQmFzZUxpc3RDb21wb25lbnQsXHJcbiAgICBEYXRhU2VydmljZSxcclxuICAgIEdldE9yZGVyTGlzdCxcclxuICAgIExvY2FsU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBPcmRlckxpc3RPcHRpb25zLFxyXG4gICAgU2VydmVyQ29uZmlnU2VydmljZSxcclxuICAgIFNvcnRPcmRlcixcclxufSBmcm9tICdAdmVuZHVyZS9hZG1pbi11aS9jb3JlJztcclxuaW1wb3J0IHsgT3JkZXIgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL2dlbmVyYXRlZC10eXBlcyc7XHJcbmltcG9ydCB7IG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBza2lwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmludGVyZmFjZSBPcmRlckZpbHRlckNvbmZpZyB7XHJcbiAgICBhY3RpdmU/OiBib29sZWFuO1xyXG4gICAgc3RhdGVzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBGaWx0ZXJQcmVzZXQge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIGNvbmZpZzogT3JkZXJGaWx0ZXJDb25maWc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd2ZHItb3JkZXItbGlzdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vb3JkZXItbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9vcmRlci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyTGlzdENvbXBvbmVudFxyXG4gICAgZXh0ZW5kcyBCYXNlTGlzdENvbXBvbmVudDxHZXRPcmRlckxpc3QuUXVlcnksIEdldE9yZGVyTGlzdC5JdGVtcz5cclxuICAgIGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIHNlYXJjaE9yZGVyQ29kZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xyXG4gICAgc2VhcmNoTGFzdE5hbWVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgIGN1c3RvbUZpbHRlckZvcm06IEZvcm1Hcm91cDtcclxuICAgIG9yZGVyU3RhdGVzID0gdGhpcy5zZXJ2ZXJDb25maWdTZXJ2aWNlLmdldE9yZGVyUHJvY2Vzc1N0YXRlcygpLm1hcChpdGVtID0+IGl0ZW0ubmFtZSk7XHJcbiAgICBmaWx0ZXJQcmVzZXRzOiBGaWx0ZXJQcmVzZXRbXSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdvcGVuJyxcclxuICAgICAgICAgICAgbGFiZWw6IF8oJ29yZGVyLmZpbHRlci1wcmVzZXQtb3BlbicpLFxyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZXM6IHRoaXMub3JkZXJTdGF0ZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgIHMgPT4gcyAhPT0gJ0RlbGl2ZXJlZCcgJiYgcyAhPT0gJ0NhbmNlbGxlZCcgJiYgcyAhPT0gJ1NoaXBwZWQnLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3NoaXBwZWQnLFxyXG4gICAgICAgICAgICBsYWJlbDogXygnb3JkZXIuZmlsdGVyLXByZXNldC1zaGlwcGVkJyksXHJcbiAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHN0YXRlczogWydTaGlwcGVkJ10sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdjb21wbGV0ZWQnLFxyXG4gICAgICAgICAgICBsYWJlbDogXygnb3JkZXIuZmlsdGVyLXByZXNldC1jb21wbGV0ZWQnKSxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgc3RhdGVzOiBbJ0RlbGl2ZXJlZCcsICdDYW5jZWxsZWQnXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2FjdGl2ZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiBfKCdvcmRlci5maWx0ZXItcHJlc2V0LWFjdGl2ZScpLFxyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgXTtcclxuICAgIGFjdGl2ZVByZXNldCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHNlcnZlckNvbmZpZ1NlcnZpY2U6IFNlcnZlckNvbmZpZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKHJvdXRlciwgcm91dGUpO1xyXG4gICAgICAgIHN1cGVyLnNldFF1ZXJ5Rm4oXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgICAgICAgICAodGFrZSwgc2tpcCkgPT4gdGhpcy5kYXRhU2VydmljZS5vcmRlci5nZXRPcmRlcnMoeyB0YWtlLCBza2lwIH0pLnJlZmV0Y2hPbkNoYW5uZWxDaGFuZ2UoKSxcclxuICAgICAgICAgICAgZGF0YSA9PiBkYXRhLm9yZGVycyxcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgICAgIChza2lwLCB0YWtlKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVRdWVyeU9wdGlvbnMoXHJcbiAgICAgICAgICAgICAgICAgICAgc2tpcCxcclxuICAgICAgICAgICAgICAgICAgICB0YWtlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoT3JkZXJDb2RlQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaExhc3ROYW1lQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdmaWx0ZXInKSB8fCAnb3BlbicsXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbGFzdEZpbHRlcnMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0KCdvcmRlckxpc3RMYXN0Q3VzdG9tRmlsdGVycycpO1xyXG4gICAgICAgIGlmIChsYXN0RmlsdGVycykge1xyXG4gICAgICAgICAgICB0aGlzLnNldFF1ZXJ5UGFyYW0obGFzdEZpbHRlcnMsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZVByZXNldCQgPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXAucGlwZShcclxuICAgICAgICAgICAgbWFwKHFwbSA9PiBxcG0uZ2V0KCdmaWx0ZXInKSB8fCAnb3BlbicpLFxyXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoVGVybXMkID0gbWVyZ2UoXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoT3JkZXJDb2RlQ29udHJvbC52YWx1ZUNoYW5nZXMsXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoTGFzdE5hbWVDb250cm9sLnZhbHVlQ2hhbmdlcyxcclxuICAgICAgICApLnBpcGUoXHJcbiAgICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiAyIDwgdmFsdWUubGVuZ3RoIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCksXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWVyZ2Uoc2VhcmNoVGVybXMkLCB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXApXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtTWFwID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICBzdGF0ZXM6IG5ldyBGb3JtQ29udHJvbChxdWVyeVBhcmFtTWFwLmdldEFsbCgnc3RhdGVzJykgPz8gW10pLFxyXG4gICAgICAgICAgICBwbGFjZWRBdFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2wocXVlcnlQYXJhbU1hcC5nZXQoJ3BsYWNlZEF0U3RhcnQnKSksXHJcbiAgICAgICAgICAgIHBsYWNlZEF0RW5kOiBuZXcgRm9ybUNvbnRyb2wocXVlcnlQYXJhbU1hcC5nZXQoJ3BsYWNlZEF0RW5kJykpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEZpbHRlclByZXNldChwcmVzZXROYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBsYXN0Q3VzdG9tRmlsdGVycyA9IHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5nZXQoJ29yZGVyTGlzdExhc3RDdXN0b21GaWx0ZXJzJykgPz8ge307XHJcbiAgICAgICAgY29uc3QgZW1wdHlDdXN0b21GaWx0ZXJzID0geyBzdGF0ZXM6IHVuZGVmaW5lZCwgcGxhY2VkQXRTdGFydDogdW5kZWZpbmVkLCBwbGFjZWRBdEVuZDogdW5kZWZpbmVkIH07XHJcbiAgICAgICAgY29uc3QgZmlsdGVycyA9IHByZXNldE5hbWUgPT09ICdjdXN0b20nID8gbGFzdEN1c3RvbUZpbHRlcnMgOiBlbXB0eUN1c3RvbUZpbHRlcnM7XHJcbiAgICAgICAgdGhpcy5zZXRRdWVyeVBhcmFtKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHByZXNldE5hbWUsXHJcbiAgICAgICAgICAgICAgICBwYWdlOiAxLFxyXG4gICAgICAgICAgICAgICAgLi4uZmlsdGVycyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeyByZXBsYWNlVXJsOiB0cnVlIH0sXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUN1c3RvbUZpbHRlcnMoKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5jdXN0b21GaWx0ZXJGb3JtLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUZpbHRlcnMgPSB7XHJcbiAgICAgICAgICAgIHN0YXRlczogZm9ybVZhbHVlLnN0YXRlcyxcclxuICAgICAgICAgICAgcGxhY2VkQXRTdGFydDogZm9ybVZhbHVlLnBsYWNlZEF0U3RhcnQsXHJcbiAgICAgICAgICAgIHBsYWNlZEF0RW5kOiBmb3JtVmFsdWUucGxhY2VkQXRFbmQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNldFF1ZXJ5UGFyYW0oe1xyXG4gICAgICAgICAgICBmaWx0ZXI6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAuLi5jdXN0b21GaWx0ZXJzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyRm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgIHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5zZXQoJ29yZGVyTGlzdExhc3RDdXN0b21GaWx0ZXJzJywgY3VzdG9tRmlsdGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVRdWVyeU9wdGlvbnMoXHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgc2tpcDogbnVtYmVyLFxyXG4gICAgICAgIHRha2U6IG51bWJlcixcclxuICAgICAgICBvcmRlckNvZGVTZWFyY2hUZXJtOiBzdHJpbmcsXHJcbiAgICAgICAgY3VzdG9tZXJOYW1lU2VhcmNoVGVybTogc3RyaW5nLFxyXG4gICAgICAgIGFjdGl2ZUZpbHRlclByZXNldD86IHN0cmluZyxcclxuICAgICk6IHsgb3B0aW9uczogT3JkZXJMaXN0T3B0aW9ucyB9IHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJDb25maWcgPSB0aGlzLmZpbHRlclByZXNldHMuZmluZChwID0+IHAubmFtZSA9PT0gYWN0aXZlRmlsdGVyUHJlc2V0KTtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgICAgICBjb25zdCBmaWx0ZXI6IGFueSA9IHt9O1xyXG4gICAgICAgIGlmIChmaWx0ZXJDb25maWcpIHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckNvbmZpZy5jb25maWcuYWN0aXZlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5hY3RpdmUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXE6IGZpbHRlckNvbmZpZy5jb25maWcuYWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmlsdGVyQ29uZmlnLmNvbmZpZy5zdGF0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBpbjogZmlsdGVyQ29uZmlnLmNvbmZpZy5zdGF0ZXMsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVGaWx0ZXJQcmVzZXQgPT09ICdjdXN0b20nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwO1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0ZXMgPSBxdWVyeVBhcmFtcy5nZXRBbGwoJ3N0YXRlcycpID8/IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZWRBdFN0YXJ0ID0gcXVlcnlQYXJhbXMuZ2V0KCdwbGFjZWRBdFN0YXJ0Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlZEF0RW5kID0gcXVlcnlQYXJhbXMuZ2V0KCdwbGFjZWRBdEVuZCcpO1xyXG4gICAgICAgICAgICBpZiAoc3RhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLnN0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGluOiBzdGF0ZXMsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwbGFjZWRBdFN0YXJ0ICYmIHBsYWNlZEF0RW5kKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIub3JkZXJQbGFjZWRBdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwbGFjZWRBdFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHBsYWNlZEF0RW5kLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBsYWNlZEF0U3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5vcmRlclBsYWNlZEF0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyOiBwbGFjZWRBdFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGFjZWRBdEVuZCkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLm9yZGVyUGxhY2VkQXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBwbGFjZWRBdEVuZCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1c3RvbWVyTmFtZVNlYXJjaFRlcm0pIHtcclxuICAgICAgICAgICAgZmlsdGVyLmN1c3RvbWVyTGFzdE5hbWUgPSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluczogY3VzdG9tZXJOYW1lU2VhcmNoVGVybSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9yZGVyQ29kZVNlYXJjaFRlcm0pIHtcclxuICAgICAgICAgICAgZmlsdGVyLmNvZGUgPSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluczogb3JkZXJDb2RlU2VhcmNoVGVybSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgc2tpcCxcclxuICAgICAgICAgICAgICAgIHRha2UsXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi4oZmlsdGVyID8/IHt9KSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzb3J0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBTb3J0T3JkZXIuREVTQyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTaGlwcGluZ05hbWVzKG9yZGVyOiBPcmRlcikge1xyXG4gICAgICAgIGlmIChvcmRlci5zaGlwcGluZ0xpbmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JkZXIuc2hpcHBpbmdMaW5lcy5tYXAoc2hpcHBpbmdMaW5lID0+IHNoaXBwaW5nTGluZS5zaGlwcGluZ01ldGhvZC5uYW1lKS5qb2luKCcsICcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19