@pega/angular-sdk-components 0.242.6 → 0.242.8
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.
- package/esm2022/lib/_bridge/angular-pconnect.mjs +3 -3
- package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +4 -5
- package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +9 -5
- package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +9 -7
- package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +3 -3
- package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +3 -3
- package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +3 -3
- package/esm2022/lib/_components/field/check-box/check-box.component.mjs +3 -3
- package/esm2022/lib/_components/field/currency/currency.component.mjs +23 -18
- package/esm2022/lib/_components/field/date/date.component.mjs +3 -3
- package/esm2022/lib/_components/field/date-time/date-time.component.mjs +21 -8
- package/esm2022/lib/_components/field/decimal/decimal.component.mjs +38 -20
- package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +15 -7
- package/esm2022/lib/_components/field/email/email.component.mjs +19 -11
- package/esm2022/lib/_components/field/group/group.component.mjs +3 -3
- package/esm2022/lib/_components/field/integer/integer.component.mjs +19 -11
- package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +5 -5
- package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +3 -3
- package/esm2022/lib/_components/field/percentage/percentage.component.mjs +31 -23
- package/esm2022/lib/_components/field/phone/phone.component.mjs +10 -15
- package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +3 -3
- package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +14 -7
- package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +3 -3
- package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +3 -3
- package/esm2022/lib/_components/field/text/text.component.mjs +6 -6
- package/esm2022/lib/_components/field/text-area/text-area.component.mjs +19 -11
- package/esm2022/lib/_components/field/text-content/text-content.component.mjs +3 -3
- package/esm2022/lib/_components/field/text-input/text-input.component.mjs +19 -11
- package/esm2022/lib/_components/field/time/time.component.mjs +23 -11
- package/esm2022/lib/_components/field/url/url.component.mjs +19 -11
- package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +66 -12
- package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +6 -8
- package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +2 -2
- package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +3 -3
- package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +5 -6
- package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +3 -3
- package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +3 -3
- package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +5 -5
- package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +5 -8
- package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +10 -30
- package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +3 -3
- package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +7 -5
- package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +3 -3
- package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +3 -3
- package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +3 -3
- package/esm2022/lib/_components/infra/reference/reference.component.mjs +74 -81
- package/esm2022/lib/_components/infra/region/region.component.mjs +3 -3
- package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +24 -19
- package/esm2022/lib/_components/infra/stages/stages.component.mjs +3 -3
- package/esm2022/lib/_components/infra/view/view.component.mjs +3 -3
- package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +3 -3
- package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +3 -3
- package/esm2022/lib/_components/template/base/details-template-base.mjs +3 -3
- package/esm2022/lib/_components/template/base/form-template-base.mjs +5 -5
- package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +3 -3
- package/esm2022/lib/_components/template/case-view/case-view.component.mjs +3 -3
- package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +3 -3
- package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +3 -3
- package/esm2022/lib/_components/template/default-form/default-form.component.mjs +6 -7
- package/esm2022/lib/_components/template/details/details.component.mjs +3 -3
- package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +3 -3
- package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +3 -3
- package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +3 -3
- package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +3 -3
- package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +3 -3
- package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +3 -3
- package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +3 -3
- package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +3 -3
- package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +47 -38
- package/esm2022/lib/_components/template/field-group-template/utils.mjs +11 -0
- package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +5 -5
- package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +3 -3
- package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +3 -3
- package/esm2022/lib/_components/template/list-page/list-page.component.mjs +3 -3
- package/esm2022/lib/_components/template/list-view/list-view.component.mjs +5 -5
- package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +3 -3
- package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +3 -3
- package/esm2022/lib/_components/template/one-column/one-column.component.mjs +3 -3
- package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +3 -3
- package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +3 -3
- package/esm2022/lib/_components/template/page/page.component.mjs +3 -3
- package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +3 -3
- package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +3 -3
- package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +3 -3
- package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +19 -3
- package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +58 -25
- package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +3 -3
- package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +3 -3
- package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +3 -3
- package/esm2022/lib/_components/template/three-column/three-column.component.mjs +3 -3
- package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +3 -3
- package/esm2022/lib/_components/template/two-column/two-column.component.mjs +3 -3
- package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +3 -3
- package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +3 -3
- package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +3 -3
- package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +3 -3
- package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +3 -3
- package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +3 -3
- package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +3 -3
- package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +3 -3
- package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +3 -3
- package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +3 -3
- package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +3 -3
- package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +3 -3
- package/esm2022/lib/_components/widget/todo/todo.component.mjs +8 -6
- package/esm2022/lib/_components/widget/utility/utility.component.mjs +3 -3
- package/esm2022/lib/_directives/thousand-seperator.directive.mjs +3 -3
- package/esm2022/lib/_helpers/formatters/boolean.mjs +2 -2
- package/esm2022/lib/_helpers/formatters/common.mjs +6 -3
- package/esm2022/lib/_helpers/formatters/currency.mjs +2 -2
- package/esm2022/lib/_helpers/formatters/date.mjs +2 -2
- package/esm2022/lib/_helpers/formatters/format-utils.mjs +10 -2
- package/esm2022/lib/_helpers/formatters/index.mjs +16 -16
- package/esm2022/lib/_helpers/template-utils.mjs +3 -3
- package/esm2022/lib/_helpers/utils.mjs +40 -18
- package/esm2022/lib/_messages/error-messages.service.mjs +3 -3
- package/esm2022/lib/_messages/progress-spinner.service.mjs +3 -3
- package/esm2022/lib/_messages/update-worklist.service.mjs +3 -3
- package/esm2022/lib/_services/banner.service.mjs +3 -3
- package/esm2022/lib/_services/case.service.mjs +3 -3
- package/esm2022/lib/_services/datapage.service.mjs +3 -3
- package/esm2022/lib/_services/server-config.service.mjs +3 -3
- package/esm2022/public-api.mjs +5 -3
- package/fesm2022/pega-angular-sdk-components.mjs +1034 -818
- package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
- package/lib/_components/designSystemExtension/banner/banner.component.d.ts +0 -1
- package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +0 -1
- package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +1 -1
- package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +1 -0
- package/lib/_components/designSystemExtension/operator/operator.component.d.ts +2 -3
- package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +0 -1
- package/lib/_components/field/auto-complete/auto-complete.component.d.ts +0 -1
- package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +0 -1
- package/lib/_components/field/check-box/check-box.component.d.ts +0 -1
- package/lib/_components/field/currency/currency.component.d.ts +0 -1
- package/lib/_components/field/date/date.component.d.ts +0 -1
- package/lib/_components/field/date-time/date-time.component.d.ts +1 -1
- package/lib/_components/field/decimal/decimal.component.d.ts +1 -1
- package/lib/_components/field/dropdown/dropdown.component.d.ts +1 -1
- package/lib/_components/field/email/email.component.d.ts +0 -1
- package/lib/_components/field/group/group.component.d.ts +0 -1
- package/lib/_components/field/integer/integer.component.d.ts +1 -2
- package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -2
- package/lib/_components/field/multiselect/multiselect.component.d.ts +0 -1
- package/lib/_components/field/percentage/percentage.component.d.ts +1 -2
- package/lib/_components/field/phone/phone.component.d.ts +0 -7
- package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +0 -1
- package/lib/_components/field/rich-text/rich-text.component.d.ts +1 -2
- package/lib/_components/field/scalar-list/scalar-list.component.d.ts +0 -1
- package/lib/_components/field/semantic-link/semantic-link.component.d.ts +0 -1
- package/lib/_components/field/text/text.component.d.ts +0 -1
- package/lib/_components/field/text-area/text-area.component.d.ts +1 -2
- package/lib/_components/field/text-content/text-content.component.d.ts +0 -1
- package/lib/_components/field/text-input/text-input.component.d.ts +1 -2
- package/lib/_components/field/time/time.component.d.ts +1 -2
- package/lib/_components/field/url/url.component.d.ts +1 -2
- package/lib/_components/field/user-reference/user-reference.component.d.ts +0 -1
- package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +0 -1
- package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +0 -1
- package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +0 -2
- package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +0 -1
- package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +0 -1
- package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
- package/lib/_components/infra/assignment/assignment.component.d.ts +1 -2
- package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +2 -11
- package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +0 -1
- package/lib/_components/infra/defer-load/defer-load.component.d.ts +1 -1
- package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
- package/lib/_components/infra/multi-step/multi-step.component.d.ts +0 -1
- package/lib/_components/infra/navbar/navbar.component.d.ts +0 -1
- package/lib/_components/infra/reference/reference.component.d.ts +23 -3
- package/lib/_components/infra/region/region.component.d.ts +0 -1
- package/lib/_components/infra/root-container/root-container.component.d.ts +3 -1
- package/lib/_components/infra/stages/stages.component.d.ts +0 -1
- package/lib/_components/infra/view/view.component.d.ts +0 -1
- package/lib/_components/template/app-shell/app-shell.component.d.ts +0 -1
- package/lib/_components/template/banner-page/banner-page.component.d.ts +0 -1
- package/lib/_components/template/base/details-template-base.d.ts +0 -1
- package/lib/_components/template/base/form-template-base.d.ts +1 -1
- package/lib/_components/template/case-summary/case-summary.component.d.ts +0 -1
- package/lib/_components/template/case-view/case-view.component.d.ts +0 -1
- package/lib/_components/template/confirmation/confirmation.component.d.ts +0 -1
- package/lib/_components/template/data-reference/data-reference.component.d.ts +0 -1
- package/lib/_components/template/default-form/default-form.component.d.ts +2 -3
- package/lib/_components/template/details/details.component.d.ts +0 -1
- package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +0 -1
- package/lib/_components/template/details-one-column/details-one-column.component.d.ts +0 -1
- package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +0 -1
- package/lib/_components/template/details-three-column/details-three-column.component.d.ts +0 -1
- package/lib/_components/template/details-two-column/details-two-column.component.d.ts +0 -1
- package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +0 -1
- package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +0 -1
- package/lib/_components/template/field-group-template/field-group-template.component.d.ts +12 -9
- package/lib/_components/template/field-group-template/utils.d.ts +1 -0
- package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +0 -1
- package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +0 -1
- package/lib/_components/template/list-page/list-page.component.d.ts +0 -1
- package/lib/_components/template/list-view/list-view.component.d.ts +1 -2
- package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +0 -1
- package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +0 -1
- package/lib/_components/template/one-column/one-column.component.d.ts +0 -1
- package/lib/_components/template/one-column-page/one-column-page.component.d.ts +0 -1
- package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +0 -1
- package/lib/_components/template/page/page.component.d.ts +0 -1
- package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +0 -1
- package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +0 -1
- package/lib/_components/template/simple-table/simple-table.component.d.ts +0 -1
- package/lib/_components/template/simple-table-manual/helpers.d.ts +9 -2
- package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +8 -3
- package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +0 -1
- package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +0 -1
- package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +0 -1
- package/lib/_components/template/three-column/three-column.component.d.ts +0 -1
- package/lib/_components/template/three-column-page/three-column-page.component.d.ts +0 -1
- package/lib/_components/template/two-column/two-column.component.d.ts +0 -1
- package/lib/_components/template/two-column-page/two-column-page.component.d.ts +0 -1
- package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +0 -1
- package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +0 -1
- package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +0 -1
- package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +1 -2
- package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +0 -1
- package/lib/_components/widget/attachment/attachment.component.d.ts +1 -2
- package/lib/_components/widget/case-history/case-history.component.d.ts +0 -1
- package/lib/_components/widget/feed-container/feed-container.component.d.ts +0 -1
- package/lib/_components/widget/file-utility/file-utility.component.d.ts +0 -1
- package/lib/_components/widget/quick-create/quick-create.component.d.ts +0 -1
- package/lib/_components/widget/todo/todo.component.d.ts +2 -3
- package/lib/_components/widget/utility/utility.component.d.ts +0 -1
- package/lib/_helpers/formatters/boolean.d.ts +1 -2
- package/lib/_helpers/formatters/common.d.ts +1 -1
- package/lib/_helpers/formatters/currency.d.ts +1 -2
- package/lib/_helpers/formatters/date.d.ts +1 -2
- package/lib/_helpers/formatters/index.d.ts +1 -2
- package/lib/_helpers/utils.d.ts +8 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -2
- package/esm2022/lib/_services/idle-detection.service.mjs +0 -26
- package/lib/_services/idle-detection.service.d.ts +0 -9
package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* eslint-disable max-classes-per-file */
|
|
2
1
|
import { Component, Input, ViewChild, forwardRef } from '@angular/core';
|
|
3
2
|
import { CommonModule } from '@angular/common';
|
|
4
3
|
import { MatButtonModule } from '@angular/material/button';
|
|
@@ -13,7 +12,7 @@ import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
|
|
13
12
|
import isEqual from 'fast-deep-equal';
|
|
14
13
|
import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
|
|
15
14
|
import { getReferenceList } from '../../../_helpers/field-group-utils';
|
|
16
|
-
import { buildFieldsForTable, filterDataByCommonFields, filterDataByDate, getContext } from './helpers';
|
|
15
|
+
import { buildFieldsForTable, evaluateAllowRowAction, filterDataByCommonFields, filterDataByDate, getContext } from './helpers';
|
|
17
16
|
import { getSeconds } from '../../../_helpers/common';
|
|
18
17
|
import * as i0 from "@angular/core";
|
|
19
18
|
import * as i1 from "../../../_bridge/angular-pconnect";
|
|
@@ -74,8 +73,11 @@ export class SimpleTableManualComponent {
|
|
|
74
73
|
this.arFilterSecondaryButtons$ = [];
|
|
75
74
|
this.allowEditingInModal = false;
|
|
76
75
|
this.isInitialized = false;
|
|
76
|
+
this.localizedVal = PCore.getLocaleUtils().getLocaleValue;
|
|
77
|
+
this.localeCategory = 'SimpleTable';
|
|
77
78
|
}
|
|
78
79
|
ngOnInit() {
|
|
80
|
+
this.elementsData = new MatTableDataSource([]);
|
|
79
81
|
this.isInitialized = true;
|
|
80
82
|
// First thing in initialization is registering and subscribing to the AngularPConnect service
|
|
81
83
|
this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
|
|
@@ -124,13 +126,23 @@ export class SimpleTableManualComponent {
|
|
|
124
126
|
// Adapted from Nebula
|
|
125
127
|
const { referenceList = [], // if referenceList not in configProps$, default to empy list
|
|
126
128
|
renderMode, children, // destructure children into an array var: "resolvedFields"
|
|
127
|
-
presets, allowTableEdit, label: labelProp, propertyLabel, fieldMetadata, editMode, addAndEditRowsWithin, viewForAddAndEditModal, editModeConfig, displayMode, useSeparateViewForEdit, viewForEditModal, targetClassLabel } = this.configProps$;
|
|
129
|
+
presets, allowActions, allowTableEdit, allowRowDelete, label: labelProp, propertyLabel, fieldMetadata, editMode, addAndEditRowsWithin, viewForAddAndEditModal, editModeConfig, displayMode, useSeparateViewForEdit, viewForEditModal, targetClassLabel } = this.configProps$;
|
|
130
|
+
const simpleTableManualProps = {};
|
|
131
|
+
if (this.checkIfAllowActionsOrRowEditingExist(allowActions) && editMode) {
|
|
132
|
+
simpleTableManualProps.hideAddRow = allowActions?.allowAdd === false;
|
|
133
|
+
simpleTableManualProps.hideDeleteRow = allowActions?.allowDelete === false;
|
|
134
|
+
simpleTableManualProps.hideEditRow = allowActions?.allowEdit === false;
|
|
135
|
+
simpleTableManualProps.disableDragDrop = allowActions?.allowDragDrop === false;
|
|
136
|
+
}
|
|
137
|
+
else if (allowTableEdit === false) {
|
|
138
|
+
simpleTableManualProps.hideAddRow = true;
|
|
139
|
+
simpleTableManualProps.hideDeleteRow = true;
|
|
140
|
+
simpleTableManualProps.disableDragDrop = true;
|
|
141
|
+
}
|
|
128
142
|
this.referenceListStr = getContext(this.pConn$).referenceListStr;
|
|
129
143
|
this.label = labelProp || propertyLabel;
|
|
130
144
|
this.parameters = fieldMetadata?.datasource?.parameters;
|
|
131
145
|
this.targetClassLabel = targetClassLabel;
|
|
132
|
-
const hideAddRow = allowTableEdit === false;
|
|
133
|
-
const hideDeleteRow = allowTableEdit === false;
|
|
134
146
|
let { contextClass } = this.configProps$;
|
|
135
147
|
this.referenceList = referenceList;
|
|
136
148
|
if (!contextClass) {
|
|
@@ -162,10 +174,10 @@ export class SimpleTableManualComponent {
|
|
|
162
174
|
this.readOnlyMode = renderMode === 'ReadOnly';
|
|
163
175
|
this.editableMode = renderMode === 'Editable';
|
|
164
176
|
const isDisplayModeEnabled = displayMode === 'DISPLAY_ONLY';
|
|
165
|
-
this.showAddRowButton = !this.readOnlyMode && !hideAddRow;
|
|
177
|
+
this.showAddRowButton = !this.readOnlyMode && !simpleTableManualProps.hideAddRow;
|
|
166
178
|
this.allowEditingInModal =
|
|
167
179
|
(editMode ? editMode === 'modal' : addAndEditRowsWithin === 'modal') && !(renderMode === 'ReadOnly' || isDisplayModeEnabled);
|
|
168
|
-
const showDeleteButton = this.editableMode && !hideDeleteRow;
|
|
180
|
+
const showDeleteButton = this.editableMode && !simpleTableManualProps.hideDeleteRow && evaluateAllowRowAction(allowRowDelete, this.rowData);
|
|
169
181
|
this.defaultView = editModeConfig ? editModeConfig.defaultView : viewForAddAndEditModal;
|
|
170
182
|
this.bUseSeparateViewForEdit = editModeConfig ? editModeConfig.useSeparateViewForEdit : useSeparateViewForEdit;
|
|
171
183
|
this.editView = editModeConfig ? editModeConfig.editView : viewForEditModal;
|
|
@@ -196,7 +208,7 @@ export class SimpleTableManualComponent {
|
|
|
196
208
|
return field;
|
|
197
209
|
});
|
|
198
210
|
// for adding rows to table when editable and not modal view
|
|
199
|
-
if (this.prevReferenceList.length !== this.referenceList.length
|
|
211
|
+
if (this.prevReferenceList.length !== this.referenceList.length) {
|
|
200
212
|
this.buildElementsForTable();
|
|
201
213
|
}
|
|
202
214
|
// for edit and adding rows in modal view and to generate readonly list
|
|
@@ -219,6 +231,9 @@ export class SimpleTableManualComponent {
|
|
|
219
231
|
// Note that the "property" shown in the column ("FirstName" in the above examples) is what
|
|
220
232
|
// ties the 3 data structures together.
|
|
221
233
|
}
|
|
234
|
+
checkIfAllowActionsOrRowEditingExist(newflagobject) {
|
|
235
|
+
return (newflagobject && Object.keys(newflagobject).length > 0) || this.pConn$.getComponentConfig().allowRowEdit;
|
|
236
|
+
}
|
|
222
237
|
initializeDefaultPageInstructions() {
|
|
223
238
|
if (this.isInitialized) {
|
|
224
239
|
this.isInitialized = false;
|
|
@@ -236,8 +251,8 @@ export class SimpleTableManualComponent {
|
|
|
236
251
|
return `${recordsCount || 0} result${recordsCount > 1 ? 's' : ''}`;
|
|
237
252
|
}
|
|
238
253
|
sortCompare(a, b) {
|
|
239
|
-
let aValue = a[this.compareRef];
|
|
240
|
-
let bValue = b[this.compareRef];
|
|
254
|
+
let aValue = a[0][this.compareRef];
|
|
255
|
+
let bValue = b[0][this.compareRef];
|
|
241
256
|
if (this.compareType == 'Date' || this.compareType == 'DateTime') {
|
|
242
257
|
aValue = getSeconds(aValue);
|
|
243
258
|
bValue = getSeconds(bValue);
|
|
@@ -350,13 +365,15 @@ export class SimpleTableManualComponent {
|
|
|
350
365
|
// run through list of elements in path, if menu not in th path, then want to
|
|
351
366
|
// hide (toggle) the menu
|
|
352
367
|
const eventPath = event.path;
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
eventPath[eventIndex].
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
368
|
+
if (eventPath) {
|
|
369
|
+
for (let eventIndex = 0; eventIndex < eventPath.length; eventIndex++) {
|
|
370
|
+
if (eventPath[eventIndex].className == 'psdk-modal-file-top' ||
|
|
371
|
+
eventPath[eventIndex].tagName == 'BUTTON' ||
|
|
372
|
+
eventPath[eventIndex].tagName == 'MAT-OPTION' ||
|
|
373
|
+
eventPath[eventIndex].tagName == 'MAT-INPUT') {
|
|
374
|
+
bInPopUp = true;
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
360
377
|
}
|
|
361
378
|
}
|
|
362
379
|
if (!bInPopUp) {
|
|
@@ -458,7 +475,8 @@ export class SimpleTableManualComponent {
|
|
|
458
475
|
this.filterContainsValue$ = '';
|
|
459
476
|
}
|
|
460
477
|
}
|
|
461
|
-
filterData(
|
|
478
|
+
filterData(element) {
|
|
479
|
+
const item = element[0];
|
|
462
480
|
let bKeep = true;
|
|
463
481
|
for (const filterObj of this.filterByColumns) {
|
|
464
482
|
if (filterObj.containsFilterValue != '' || filterObj.containsFilter == 'null' || filterObj.containsFilter == 'notnull') {
|
|
@@ -473,6 +491,9 @@ export class SimpleTableManualComponent {
|
|
|
473
491
|
break;
|
|
474
492
|
}
|
|
475
493
|
}
|
|
494
|
+
else if (filterObj.containsFilterValue === '') {
|
|
495
|
+
bKeep = true;
|
|
496
|
+
}
|
|
476
497
|
// if don't keep stop filtering
|
|
477
498
|
if (!bKeep) {
|
|
478
499
|
break;
|
|
@@ -481,12 +502,19 @@ export class SimpleTableManualComponent {
|
|
|
481
502
|
return bKeep;
|
|
482
503
|
}
|
|
483
504
|
filterSortGroupBy() {
|
|
484
|
-
let theData = this.originalData.slice()
|
|
505
|
+
let theData = this.originalData.slice().map((item, index) => {
|
|
506
|
+
return [item, index];
|
|
507
|
+
});
|
|
485
508
|
// last filter config data is global
|
|
486
509
|
theData = theData.filter(this.filterData.bind(this));
|
|
487
510
|
// last sort config data is global
|
|
488
511
|
theData.sort(this.sortCompare.bind(this));
|
|
489
|
-
this.rowData.data = theData;
|
|
512
|
+
this.rowData.data = theData.map(item => item[0]);
|
|
513
|
+
const newElements = new Array(this.rowData.data.length);
|
|
514
|
+
theData.forEach((item, index) => {
|
|
515
|
+
newElements[index] = this.originalElementsData[item[1]];
|
|
516
|
+
});
|
|
517
|
+
this.elementsData = newElements;
|
|
490
518
|
}
|
|
491
519
|
_headerSortClick(event, columnData) {
|
|
492
520
|
// images 0 - filter, 1 - arrow, 2 - more
|
|
@@ -731,6 +759,10 @@ export class SimpleTableManualComponent {
|
|
|
731
759
|
this.referenceList.forEach((element, index) => {
|
|
732
760
|
const data = [];
|
|
733
761
|
this.rawFields?.forEach(item => {
|
|
762
|
+
item = {
|
|
763
|
+
...item,
|
|
764
|
+
config: { ...item.config, label: '', displayMode: this.readOnlyMode || this.allowEditingInModal ? 'DISPLAY_ONLY' : undefined }
|
|
765
|
+
};
|
|
734
766
|
const referenceListData = getReferenceList(this.pConn$);
|
|
735
767
|
const isDatapage = referenceListData.startsWith('D_');
|
|
736
768
|
const pageReferenceValue = isDatapage ? `${referenceListData}[${index}]` : `${this.pConn$.getPageReference()}${referenceListData}[${index}]`;
|
|
@@ -748,12 +780,13 @@ export class SimpleTableManualComponent {
|
|
|
748
780
|
});
|
|
749
781
|
eleData.push(data);
|
|
750
782
|
});
|
|
783
|
+
this.originalElementsData = eleData;
|
|
751
784
|
this.elementsData = eleData;
|
|
752
785
|
}
|
|
753
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.
|
|
754
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: SimpleTableManualComponent, isStandalone: true, selector: "app-simple-table-manual", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"bVisible$\">\n <div class=\"simple-table-wrapper\">\n <h3 *ngIf=\"label\" className=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <table *ngIf=\"readOnlyMode || allowEditingInModal\" mat-table [dataSource]=\"rowData\" class=\"mat-elevation-z8\" id=\"readonly-table\" matSort>\n <ng-container *ngFor=\"let dCol of processedFields\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n <div>{{ dCol.config.label }}</div>\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <div *ngIf=\"allowEditingInModal\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <div class=\"header-icon\">\n <button mat-icon-button [matMenuTriggerFor]=\"utilityMenu\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ settingsSvgIcon$ }}\" />\n </button>\n <mat-menu #utilityMenu=\"matMenu\" overlapTrigger=\"false\">\n <button mat-menu-item (click)=\"editRecord(element, j)\">Edit</button>\n <button mat-menu-item (click)=\"deleteRecord(j)\">Delete</button>\n </mat-menu>\n </div>\n </td>\n </div>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <table *ngIf=\"editableMode && !allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"editable-table\">\n <ng-container *ngFor=\"let dCol of fieldDefs; let i = index\">\n <ng-container *ngIf=\"dCol.name != 'DeleteIcon'\" [matColumnDef]=\"dCol.name\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\">{{ dCol.label }}</th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <button id=\"delete-button\" mat-icon-button (click)=\"deleteRecord(j)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ menuIconOverride$ }}\" />\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"editableMode && referenceList?.length === 0\">No Records Found.</div>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"readOnlyMode && rowData?.data?.length === 0\">No Records Found.</div>\n </div>\n <button *ngIf=\"showAddRowButton\" mat-button color=\"primary\" style=\"font-size: 16px\" (click)=\"addRecord()\">+ Add</button>\n</ng-container>\n\n<!-- pop overs for filters-->\n<div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n", styles: [".simple-table-wrapper{width:100%;margin-top:.5rem;margin-bottom:.5rem;overflow-y:auto}table{width:100%}::ng-deep .mat-sort-header-content{white-space:normal}::ng-deep td.mat-mdc-cell{white-space:normal}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{border-right:1px solid var(--app-neutral-light-color);padding:8px!important}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:normal;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem}.psdk-icon-search{vertical-align:sub;padding:0rem .125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{display:inline-grid}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}tr.mat-mdc-row{cursor:pointer}tr.mat-mdc-header-row{background:var(--app-table-header-background-color)}.psdk-data-readonly{margin-top:.625rem;width:100%}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none;background:var(--app-form-color)}.psdk-utility-card-action-svg-icon{width:1.4rem}.label{margin:8px}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i4.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i4.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatTableModule) }, { kind: "component", type: i0.forwardRef(() => i5.MatTable), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatHeaderCellDef), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i5.MatHeaderRowDef), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatColumnDef), selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatCellDef), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i5.MatRowDef), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatHeaderCell), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(() => i5.MatCell), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(() => i5.MatHeaderRow), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(() => i5.MatRow), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i6.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSortModule) }, { kind: "directive", type: i0.forwardRef(() => i7.MatSort), selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(() => i7.MatSortHeader), selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i8.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i8.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i8.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i9.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i9.MatLabel), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(() => i9.MatSuffix), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatDatepickerModule) }, { kind: "component", type: i0.forwardRef(() => i10.MatDatepicker), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(() => i10.MatDatepickerInput), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(() => i10.MatDatepickerToggle), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatOptionModule) }, { kind: "component", type: i0.forwardRef(() => i11.MatOption), selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSelectModule) }, { kind: "component", type: i0.forwardRef(() => i12.MatSelect), selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatInputModule) }, { kind: "directive", type: i0.forwardRef(() => i13.MatInput), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i0.forwardRef(() => ComponentMapperComponent), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
|
|
786
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SimpleTableManualComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i3.DatapageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
787
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SimpleTableManualComponent, isStandalone: true, selector: "app-simple-table-manual", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"bVisible$\">\n <div class=\"simple-table-wrapper\">\n <h3 *ngIf=\"label\" className=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <table *ngIf=\"readOnlyMode || allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"readonly-table\" matSort>\n <ng-container *ngFor=\"let dCol of processedFields; let i = index\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n <div>{{ dCol.config.label }}</div>\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <div *ngIf=\"allowEditingInModal\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <div class=\"header-icon\">\n <button mat-icon-button [matMenuTriggerFor]=\"utilityMenu\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ settingsSvgIcon$ }}\" />\n </button>\n <mat-menu #utilityMenu=\"matMenu\" overlapTrigger=\"false\">\n <button mat-menu-item (click)=\"editRecord(element, j)\">Edit</button>\n <button mat-menu-item (click)=\"deleteRecord(j)\">Delete</button>\n </mat-menu>\n </div>\n </td>\n </div>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n <tr class=\"mat-row psdk-no-records\" *matNoDataRow>\n <td id=\"no-records\" class=\"mat-cell\" [attr.colspan]=\"displayedColumns.length\">\n {{ utils.getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.') }}\n </td>\n </tr>\n </table>\n <table *ngIf=\"editableMode && !allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"editable-table\">\n <ng-container *ngFor=\"let dCol of fieldDefs; let i = index\">\n <ng-container *ngIf=\"dCol.name != 'DeleteIcon'\" [matColumnDef]=\"dCol.name\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\">{{ dCol.label }}</th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <button id=\"delete-button\" mat-icon-button (click)=\"deleteRecord(j)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ menuIconOverride$ }}\" />\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n <tr class=\"mat-row psdk-no-records\" *matNoDataRow>\n <td id=\"no-records\" class=\"mat-cell\" [attr.colspan]=\"displayedColumns.length\">\n {{ utils.getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.') }}\n </td>\n </tr>\n </table>\n </div>\n <button *ngIf=\"showAddRowButton\" mat-button color=\"primary\" style=\"font-size: 16px\" (click)=\"addRecord()\">\n + {{ localizedVal('Add', localeCategory) }}\n </button>\n</ng-container>\n\n<!-- pop overs for filters-->\n<div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n", styles: [".simple-table-wrapper{width:100%;margin-top:.5rem;margin-bottom:.5rem;overflow-y:auto}table{width:100%}::ng-deep .mat-sort-header-content{white-space:normal}::ng-deep td.mat-mdc-cell{white-space:normal}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{border-right:1px solid var(--app-neutral-light-color);padding:8px!important;min-width:10rem}::ng-deep th.mat-mdc-header-cell:last-child,td.mat-mdc-cell:last-child{min-width:2rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:normal;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem}.psdk-icon-search{vertical-align:sub;padding:0rem .125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{display:inline-grid}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}tr.mat-mdc-row{cursor:pointer}tr.mat-mdc-header-row{background:var(--app-table-header-background-color)}.psdk-data-readonly{margin-top:.625rem;width:100%}.psdk-no-records{height:56px;text-align:center;border:1px solid var(--app-neutral-light-color);border-top:none;background:var(--app-form-color)}.psdk-utility-card-action-svg-icon{width:1.4rem}.label{margin:8px}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i4.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i4.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatTableModule) }, { kind: "component", type: i0.forwardRef(() => i5.MatTable), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatHeaderCellDef), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i5.MatHeaderRowDef), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatColumnDef), selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatCellDef), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i5.MatRowDef), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatHeaderCell), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(() => i5.MatCell), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(() => i5.MatHeaderRow), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(() => i5.MatRow), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatNoDataRow), selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i6.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSortModule) }, { kind: "directive", type: i0.forwardRef(() => i7.MatSort), selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(() => i7.MatSortHeader), selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i8.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i8.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i8.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i9.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i9.MatLabel), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(() => i9.MatSuffix), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatDatepickerModule) }, { kind: "component", type: i0.forwardRef(() => i10.MatDatepicker), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(() => i10.MatDatepickerInput), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(() => i10.MatDatepickerToggle), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatOptionModule) }, { kind: "component", type: i0.forwardRef(() => i11.MatOption), selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSelectModule) }, { kind: "component", type: i0.forwardRef(() => i12.MatSelect), selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatInputModule) }, { kind: "directive", type: i0.forwardRef(() => i13.MatInput), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i0.forwardRef(() => ComponentMapperComponent), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
|
|
755
788
|
}
|
|
756
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.
|
|
789
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SimpleTableManualComponent, decorators: [{
|
|
757
790
|
type: Component,
|
|
758
791
|
args: [{ selector: 'app-simple-table-manual', standalone: true, imports: [
|
|
759
792
|
CommonModule,
|
|
@@ -767,7 +800,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
767
800
|
MatSelectModule,
|
|
768
801
|
MatInputModule,
|
|
769
802
|
forwardRef(() => ComponentMapperComponent)
|
|
770
|
-
], template: "<ng-container *ngIf=\"bVisible$\">\n <div class=\"simple-table-wrapper\">\n <h3 *ngIf=\"label\" className=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <table *ngIf=\"readOnlyMode || allowEditingInModal\" mat-table [dataSource]=\"rowData\" class=\"mat-elevation-z8\" id=\"readonly-table\" matSort>\n <ng-container *ngFor=\"let dCol of processedFields\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n <div>{{ dCol.config.label }}</div>\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <div *ngIf=\"allowEditingInModal\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <div class=\"header-icon\">\n <button mat-icon-button [matMenuTriggerFor]=\"utilityMenu\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ settingsSvgIcon$ }}\" />\n </button>\n <mat-menu #utilityMenu=\"matMenu\" overlapTrigger=\"false\">\n <button mat-menu-item (click)=\"editRecord(element, j)\">Edit</button>\n <button mat-menu-item (click)=\"deleteRecord(j)\">Delete</button>\n </mat-menu>\n </div>\n </td>\n </div>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <table *ngIf=\"editableMode && !allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"editable-table\">\n <ng-container *ngFor=\"let dCol of fieldDefs; let i = index\">\n <ng-container *ngIf=\"dCol.name != 'DeleteIcon'\" [matColumnDef]=\"dCol.name\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\">{{ dCol.label }}</th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <button id=\"delete-button\" mat-icon-button (click)=\"deleteRecord(j)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ menuIconOverride$ }}\" />\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"editableMode && referenceList?.length === 0\">No Records Found.</div>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"readOnlyMode && rowData?.data?.length === 0\">No Records Found.</div>\n </div>\n <button *ngIf=\"showAddRowButton\" mat-button color=\"primary\" style=\"font-size: 16px\" (click)=\"addRecord()\">+ Add</button>\n</ng-container>\n\n<!-- pop overs for filters-->\n<div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n", styles: [".simple-table-wrapper{width:100%;margin-top:.5rem;margin-bottom:.5rem;overflow-y:auto}table{width:100%}::ng-deep .mat-sort-header-content{white-space:normal}::ng-deep td.mat-mdc-cell{white-space:normal}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{border-right:1px solid var(--app-neutral-light-color);padding:8px!important}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:normal;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem}.psdk-icon-search{vertical-align:sub;padding:0rem .125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{display:inline-grid}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}tr.mat-mdc-row{cursor:pointer}tr.mat-mdc-header-row{background:var(--app-table-header-background-color)}.psdk-data-readonly{margin-top:.625rem;width:100%}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none;background:var(--app-form-color)}.psdk-utility-card-action-svg-icon{width:1.4rem}.label{margin:8px}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}\n"] }]
|
|
803
|
+
], template: "<ng-container *ngIf=\"bVisible$\">\n <div class=\"simple-table-wrapper\">\n <h3 *ngIf=\"label\" className=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <table *ngIf=\"readOnlyMode || allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"readonly-table\" matSort>\n <ng-container *ngFor=\"let dCol of processedFields; let i = index\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n <div>{{ dCol.config.label }}</div>\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <div *ngIf=\"allowEditingInModal\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <div class=\"header-icon\">\n <button mat-icon-button [matMenuTriggerFor]=\"utilityMenu\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ settingsSvgIcon$ }}\" />\n </button>\n <mat-menu #utilityMenu=\"matMenu\" overlapTrigger=\"false\">\n <button mat-menu-item (click)=\"editRecord(element, j)\">Edit</button>\n <button mat-menu-item (click)=\"deleteRecord(j)\">Delete</button>\n </mat-menu>\n </div>\n </td>\n </div>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n <tr class=\"mat-row psdk-no-records\" *matNoDataRow>\n <td id=\"no-records\" class=\"mat-cell\" [attr.colspan]=\"displayedColumns.length\">\n {{ utils.getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.') }}\n </td>\n </tr>\n </table>\n <table *ngIf=\"editableMode && !allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"editable-table\">\n <ng-container *ngFor=\"let dCol of fieldDefs; let i = index\">\n <ng-container *ngIf=\"dCol.name != 'DeleteIcon'\" [matColumnDef]=\"dCol.name\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\">{{ dCol.label }}</th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <button id=\"delete-button\" mat-icon-button (click)=\"deleteRecord(j)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ menuIconOverride$ }}\" />\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n <tr class=\"mat-row psdk-no-records\" *matNoDataRow>\n <td id=\"no-records\" class=\"mat-cell\" [attr.colspan]=\"displayedColumns.length\">\n {{ utils.getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.') }}\n </td>\n </tr>\n </table>\n </div>\n <button *ngIf=\"showAddRowButton\" mat-button color=\"primary\" style=\"font-size: 16px\" (click)=\"addRecord()\">\n + {{ localizedVal('Add', localeCategory) }}\n </button>\n</ng-container>\n\n<!-- pop overs for filters-->\n<div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n", styles: [".simple-table-wrapper{width:100%;margin-top:.5rem;margin-bottom:.5rem;overflow-y:auto}table{width:100%}::ng-deep .mat-sort-header-content{white-space:normal}::ng-deep td.mat-mdc-cell{white-space:normal}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{border-right:1px solid var(--app-neutral-light-color);padding:8px!important;min-width:10rem}::ng-deep th.mat-mdc-header-cell:last-child,td.mat-mdc-cell:last-child{min-width:2rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:normal;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem}.psdk-icon-search{vertical-align:sub;padding:0rem .125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{display:inline-grid}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}tr.mat-mdc-row{cursor:pointer}tr.mat-mdc-header-row{background:var(--app-table-header-background-color)}.psdk-data-readonly{margin-top:.625rem;width:100%}.psdk-no-records{height:56px;text-align:center;border:1px solid var(--app-neutral-light-color);border-top:none;background:var(--app-form-color)}.psdk-utility-card-action-svg-icon{width:1.4rem}.label{margin:8px}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}\n"] }]
|
|
771
804
|
}], ctorParameters: () => [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i3.DatapageService }], propDecorators: { sort: [{
|
|
772
805
|
type: ViewChild,
|
|
773
806
|
args: [MatSort]
|
|
@@ -776,4 +809,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
776
809
|
}], formGroup$: [{
|
|
777
810
|
type: Input
|
|
778
811
|
}] } });
|
|
779
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXRhYmxlLW1hbnVhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvdGVtcGxhdGUvc2ltcGxlLXRhYmxlLW1hbnVhbC9zaW1wbGUtdGFibGUtbWFudWFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9zaW1wbGUtdGFibGUtbWFudWFsL3NpbXBsZS10YWJsZS1tYW51YWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseUNBQXlDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxF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QkFDM0M7NklBR21CLElBQUk7c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFFVCxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9jb21wb25lbnQtbWFwcGVyL2NvbXBvbmVudC1tYXBwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEFuZ3VsYXJQQ29ubmVjdERhdGEsIEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2FuZ3VsYXItcGNvbm5lY3QnO1xuaW1wb3J0IHsgRGF0YXBhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX3NlcnZpY2VzL2RhdGFwYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0UmVmZXJlbmNlTGlzdCB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL2ZpZWxkLWdyb3VwLXV0aWxzJztcbmltcG9ydCB7IGJ1aWxkRmllbGRzRm9yVGFibGUsIGZpbHRlckRhdGFCeUNvbW1vbkZpZWxkcywgZmlsdGVyRGF0YUJ5RGF0ZSwgZ2V0Q29udGV4dCB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IGdldFNlY29uZHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9jb21tb24nO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xuXG5pbnRlcmZhY2UgU2ltcGxlVGFibGVNYW51YWxQcm9wcyB7XG4gIC8vIElmIGFueSwgZW50ZXIgYWRkaXRpb25hbCBwcm9wcyB0aGF0IG9ubHkgZXhpc3Qgb24gdGhpcyBjb21wb25lbnRcbiAgdmlzaWJpbGl0eT86IGJvb2xlYW47XG4gIGdyb3VwaW5nPzogYW55O1xuICByZWZlcmVuY2VMaXN0PzogYW55W107XG4gIGNoaWxkcmVuPzogYW55W107XG4gIHJlbmRlck1vZGU/OiBzdHJpbmc7XG4gIHByZXNldHM/OiBhbnlbXTtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHNob3dMYWJlbD86IGJvb2xlYW47XG4gIGRhdGFQYWdlTmFtZT86IHN0cmluZztcbiAgY29udGV4dENsYXNzPzogc3RyaW5nO1xuICBwcm9wZXJ0eUxhYmVsPzogc3RyaW5nO1xuICBmaWVsZE1ldGFkYXRhPzogYW55O1xuICBhbGxvd1RhYmxlRWRpdD86IGJvb2xlYW47XG4gIGVkaXRNb2RlPzogc3RyaW5nO1xuICBhZGRBbmRFZGl0Um93c1dpdGhpbj86IGFueTtcbiAgdmlld0ZvckFkZEFuZEVkaXRNb2RhbD86IGFueTtcbiAgZWRpdE1vZGVDb25maWc/OiBhbnk7XG4gIGRpc3BsYXlNb2RlPzogc3RyaW5nO1xuICB1c2VTZXBhcmF0ZVZpZXdGb3JFZGl0OiBhbnk7XG4gIHZpZXdGb3JFZGl0TW9kYWw6IGFueTtcbiAgdGFyZ2V0Q2xhc3NMYWJlbDogc3RyaW5nO1xufVxuXG5jbGFzcyBHcm91cCB7XG4gIGxldmVsID0gMDtcbiAgcGFyZW50OiBHcm91cDtcbiAgZXhwYW5kZWQgPSB0cnVlO1xuICB0b3RhbENvdW50cyA9IDA7XG4gIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5wYXJlbnQgfHwgKHRoaXMucGFyZW50LnZpc2libGUgJiYgdGhpcy5wYXJlbnQuZXhwYW5kZWQpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zaW1wbGUtdGFibGUtbWFudWFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NpbXBsZS10YWJsZS1tYW51YWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zaW1wbGUtdGFibGUtbWFudWFsLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdFNvcnRNb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIGZvcndhcmRSZWYoKCkgPT4gQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50KVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFNpbXBsZVRhYmxlTWFudWFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ6IE1hdFNvcnQ7XG5cbiAgQElucHV0KCkgcENvbm4kOiB0eXBlb2YgUENvbm5lY3Q7XG4gIEBJbnB1dCgpIGZvcm1Hcm91cCQ6IEZvcm1Hcm91cDtcblxuICAvLyBVc2VkIHdpdGggQW5ndWxhclBDb25uZWN0XG4gIGFuZ3VsYXJQQ29ubmVjdERhdGE6IEFuZ3VsYXJQQ29ubmVjdERhdGEgPSB7fTtcbiAgY29uZmlnUHJvcHMkOiBTaW1wbGVUYWJsZU1hbnVhbFByb3BzO1xuICBmaWVsZHMkOiBhbnlbXTtcblxuICBiVmlzaWJsZSQgPSB0cnVlO1xuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICByb3dEYXRhOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcbiAgb3JpZ2luYWxEYXRhOiBhbnlbXSA9IFtdO1xuICBwcm9jZXNzZWRGaWVsZHM6IGFueVtdID0gW107XG4gIGZpZWxkRGVmczogYW55W10gPSBbXTtcbiAgcmVxdWVzdGVkUmVhZE9ubHlNb2RlID0gZmFsc2U7XG4gIHJlYWRPbmx5TW9kZSA9IGZhbHNlO1xuICBlZGl0YWJsZU1vZGU6IGJvb2xlYW47XG4gIG1lbnVJY29uT3ZlcnJpZGUkOiBzdHJpbmc7XG4gIHBhZ2VSZWZlcmVuY2U6IHN0cmluZztcbiAgcmVmZXJlbmNlTGlzdDogYW55O1xuICBjb250ZXh0Q2xhc3M6IGFueTtcbiAgc2hvd0FkZFJvd0J1dHRvbjogYm9vbGVhbjtcbiAgcHJldlJlZmVyZW5jZUxpc3Q6IGFueVtdID0gW107XG4gIGVsZW1lbnRzRGF0YTogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIHJhd0ZpZWxkczogYW55O1xuICBsYWJlbD86IHN0cmluZyA9ICcnO1xuICBzZWFyY2hJY29uJDogc3RyaW5nO1xuXG4gIGJTaG93U2VhcmNoJCA9IGZhbHNlO1xuICBiQ29sdW1uUmVvcmRlciQgPSBmYWxzZTtcbiAgYkdyb3VwaW5nJCA9IGZhbHNlO1xuXG4gIHBlcmZGaWx0ZXI6IHN0cmluZztcbiAgc2VhcmNoRmlsdGVyOiBzdHJpbmc7XG5cbiAgbWVudVN2Z0ljb24kOiBzdHJpbmc7XG4gIGFycm93U3ZnSWNvbiQgPSAnJztcbiAgYXJyb3dEb3duU3ZnSWNvbiQ6IHN0cmluZztcbiAgYXJyb3dVcFN2Z0ljb24kOiBzdHJpbmc7XG5cbiAgZmlsdGVyU3ZnSWNvbiQ6IHN0cmluZztcbiAgZmlsdGVyT25TdmdJY29uJDogc3RyaW5nO1xuICBncm91cEJ5U3ZnSWNvbiQ6IHN0cmluZztcblxuICBncm91cEJ5Q29sdW1ucyQ6IHN0cmluZ1tdID0gW107XG4gIGNvbXBhcmVUeXBlOiBzdHJpbmc7XG4gIGNvbXBhcmVSZWY6IHN0cmluZztcbiAgYXJyb3dEaXJlY3Rpb24gPSAnZG93bic7XG4gIGZpbHRlckJ5Q29sdW1uczogYW55W10gPSBbXTtcbiAgY3VycmVudEZpbHRlclJlZkRhdGE6IGFueTtcbiAgZmlsdGVyQ29udGFpbnNMYWJlbCQgPSAnJztcbiAgZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gIGZpbHRlckNvbnRhaW5zVmFsdWUkOiBhbnk7XG4gIGJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcbiAgYkNvbnRhaW5zJCA9IHRydWU7XG4gIGJEYXRlVGltZSQgPSBmYWxzZTtcblxuICBiSXNEYXRlJCA9IGZhbHNlO1xuICBiSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgYklzVGltZSQgPSBmYWxzZTtcbiAgY3VycmVudEZpbHRlckltYWdlRWw6IGFueTtcblxuICBhckZpbHRlck1haW5CdXR0b25zJDogYW55W10gPSBbXTtcbiAgYXJGaWx0ZXJTZWNvbmRhcnlCdXR0b25zJDogYW55W10gPSBbXTtcbiAgc2VsZWN0aW9uTW9kZTogc3RyaW5nO1xuICBzaW5nbGVTZWxlY3Rpb25Nb2RlOiBib29sZWFuO1xuICBtdWx0aVNlbGVjdGlvbk1vZGU6IGJvb2xlYW47XG4gIHJvd0lEOiBhbnk7XG4gIHJlc3BvbnNlOiBhbnk7XG4gIGNvbXBvc2l0ZUtleXM6IGFueTtcbiAgcGFyYW1ldGVyczogYW55O1xuICBhbGxvd0VkaXRpbmdJbk1vZGFsID0gZmFsc2U7XG4gIGRlZmF1bHRWaWV3OiBhbnk7XG4gIHJlZmVyZW5jZUxpc3RTdHI6IGFueTtcbiAgYlVzZVNlcGFyYXRlVmlld0ZvckVkaXQ6IGFueTtcbiAgZWRpdFZpZXc6IGFueTtcbiAgc2V0dGluZ3NTdmdJY29uJDogc3RyaW5nO1xuXG4gIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgdGFyZ2V0Q2xhc3NMYWJlbDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYW5ndWxhclBDb25uZWN0OiBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzLFxuICAgIHByaXZhdGUgZGF0YVBhZ2VTZXJ2aWNlOiBEYXRhcGFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG4gICAgdGhpcy5jb25maWdQcm9wcyQgPSB0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpIGFzIFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG4gICAgLy8gVGhlbiwgY29udGludWUgb24gd2l0aCBvdGhlciBpbml0aWFsaXphdGlvblxuICAgIHRoaXMubWVudUljb25PdmVycmlkZSQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCd0cmFzaCcsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICAvLyBjYWxsIGNoZWNrQW5kVXBkYXRlIHdoZW4gaW5pdGlhbGl6aW5nXG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICAgIHRoaXMuZmlsdGVyU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdmaWx0ZXInLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5maWx0ZXJPblN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnZmlsdGVyLW9uJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuZ3JvdXBCeVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygncm93JywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuYkdyb3VwaW5nJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKHRoaXMuY29uZmlnUHJvcHMkLmdyb3VwaW5nKTtcbiAgICB0aGlzLm1lbnVTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ21vcmUnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG5cbiAgICB0aGlzLmFyRmlsdGVyTWFpbkJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ3N1Ym1pdCcsIGpzQWN0aW9uOiAnc3VibWl0JywgbmFtZTogJ1N1Ym1pdCcgfSk7XG4gICAgdGhpcy5hckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ2NhbmNlbCcsIGpzQWN0aW9uOiAnY2FuY2VsJywgbmFtZTogJ0NhbmNlbCcgfSk7XG5cbiAgICB0aGlzLnNlYXJjaEljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnc2VhcmNoJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgdGhpcy5zZXR0aW5nc1N2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnbW9yZScsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0FuZFVwZGF0ZSgpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkXG4gICAgLy8gdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAgIGNvbnN0IGJVcGRhdGVTZWxmID0gdGhpcy5hbmd1bGFyUENvbm5lY3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKHRoaXMpO1xuXG4gICAgLy8gT05MWSBjYWxsIHVwZGF0ZVNlbGYgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGVcbiAgICBpZiAoYlVwZGF0ZVNlbGYpIHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHVwZGF0ZVNlbGZcbiAgdXBkYXRlU2VsZigpOiB2b2lkIHtcbiAgICAvLyBtb3ZlZCB0aGlzIGZyb20gbmdPbkluaXQoKSBhbmQgY2FsbCB0aGlzIGZyb20gdGhlcmUgaW5zdGVhZC4uLlxuICAgIHRoaXMuY29uZmlnUHJvcHMkID0gdGhpcy5wQ29ubiQucmVzb2x2ZUNvbmZpZ1Byb3BzKHRoaXMucENvbm4kLmdldENvbmZpZ1Byb3BzKCkpIGFzIFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG5cbiAgICBpZiAodGhpcy5jb25maWdQcm9wcyQudmlzaWJpbGl0eSAhPSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICB0aGlzLmJWaXNpYmxlJCA9IHRoaXMuYlZpc2libGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQudmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogZ2V0Q29uZmlnUHJvcHMoKSBoYXMgZWFjaCBjaGlsZC5jb25maWcgd2l0aCBkYXRhc291cmNlIGFuZCB2YWx1ZSB1bmRlZmluZWRcbiAgICAvLyAgYnV0IGdldFJhd01ldGFkYXRhKCkgaGFzIGVhY2ggY2hpbGQuY29uZmlnIHdpdGggZGF0YXNvdXJjZSBhbmQgdmFsdWUgc2hvd2luZyB0aGVpciB1bnJlc29sdmVkIHZhbHVlcyAoZXg6IFwiQFAgdGhlUHJvcE5hbWVcIilcbiAgICAvLyAgV2UgbmVlZCB0byB1c2UgdGhlIHByb3AgbmFtZSBhcyB0aGUgXCJnbHVlXCIgdG8gdGllIHRoZSBBbmd1bGFyIE1hdGVyaWFsIHRhYmxlIGRhdGFTb3VyY2UsIGRpc3BsYXlDb2x1bW5zIGFuZCBkYXRhIHRvZ2V0aGVyLlxuICAgIC8vICBTbywgaW4gdGhlIGNvZGUgYmVsb3csIHdlJ2xsIHVzZSB0aGUgdW5yZXNvbHZlZCBjb25maWcudmFsdWUgKGJ1dCByZXBsYWNpbmcgdGhlIHNwYWNlIHdpdGggYW4gdW5kZXJzY29yZSB0byBrZWVwIHRoaW5ncyBoYXBweSlcbiAgICBjb25zdCByYXdNZXRhZGF0YSA9IHRoaXMucENvbm4kLmdldFJhd01ldGFkYXRhKCk7XG5cbiAgICAvLyBBZGFwdGVkIGZyb20gTmVidWxhXG4gICAgY29uc3Qge1xuICAgICAgcmVmZXJlbmNlTGlzdCA9IFtdLCAvLyBpZiByZWZlcmVuY2VMaXN0IG5vdCBpbiBjb25maWdQcm9wcyQsIGRlZmF1bHQgdG8gZW1weSBsaXN0XG4gICAgICByZW5kZXJNb2RlLFxuICAgICAgY2hpbGRyZW4sIC8vIGRlc3RydWN0dXJlIGNoaWxkcmVuIGludG8gYW4gYXJyYXkgdmFyOiBcInJlc29sdmVkRmllbGRzXCJcbiAgICAgIHByZXNldHMsXG4gICAgICBhbGxvd1RhYmxlRWRpdCxcbiAgICAgIGxhYmVsOiBsYWJlbFByb3AsXG4gICAgICBwcm9wZXJ0eUxhYmVsLFxuICAgICAgZmllbGRNZXRhZGF0YSxcbiAgICAgIGVkaXRNb2RlLFxuICAgICAgYWRkQW5kRWRpdFJvd3NXaXRoaW4sXG4gICAgICB2aWV3Rm9yQWRkQW5kRWRpdE1vZGFsLFxuICAgICAgZWRpdE1vZGVDb25maWcsXG4gICAgICBkaXNwbGF5TW9kZSxcbiAgICAgIHVzZVNlcGFyYXRlVmlld0ZvckVkaXQsXG4gICAgICB2aWV3Rm9yRWRpdE1vZGFsLFxuICAgICAgdGFyZ2V0Q2xhc3NMYWJlbFxuICAgIH0gPSB0aGlzLmNvbmZpZ1Byb3BzJDtcblxuICAgIHRoaXMucmVmZXJlbmNlTGlzdFN0ciA9IGdldENvbnRleHQodGhpcy5wQ29ubiQpLnJlZmVyZW5jZUxpc3RTdHI7XG4gICAgdGhpcy5sYWJlbCA9IGxhYmVsUHJvcCB8fCBwcm9wZXJ0eUxhYmVsO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IGZpZWxkTWV0YWRhdGE/LmRhdGFzb3VyY2U/LnBhcmFtZXRlcnM7XG4gICAgdGhpcy50YXJnZXRDbGFzc0xhYmVsID0gdGFyZ2V0Q2xhc3NMYWJlbDtcbiAgICBjb25zdCBoaWRlQWRkUm93ID0gYWxsb3dUYWJsZUVkaXQgPT09IGZhbHNlO1xuICAgIGNvbnN0IGhpZGVEZWxldGVSb3cgPSBhbGxvd1RhYmxlRWRpdCA9PT0gZmFsc2U7XG4gICAgbGV0IHsgY29udGV4dENsYXNzIH0gPSB0aGlzLmNvbmZpZ1Byb3BzJDtcbiAgICB0aGlzLnJlZmVyZW5jZUxpc3QgPSByZWZlcmVuY2VMaXN0O1xuICAgIGlmICghY29udGV4dENsYXNzKSB7XG4gICAgICBsZXQgbGlzdE5hbWUgPSB0aGlzLnBDb25uJC5nZXRDb21wb25lbnRDb25maWcoKS5yZWZlcmVuY2VMaXN0O1xuICAgICAgbGlzdE5hbWUgPSBQQ29yZS5nZXRBbm5vdGF0aW9uVXRpbHMoKS5nZXRQcm9wZXJ0eU5hbWUobGlzdE5hbWUpO1xuICAgICAgY29udGV4dENsYXNzID0gdGhpcy5wQ29ubiQuZ2V0RmllbGRNZXRhZGF0YShsaXN0TmFtZSk/LnBhZ2VDbGFzcztcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0Q2xhc3MgPSBjb250ZXh0Q2xhc3M7XG5cbiAgICBjb25zdCByZXNvbHZlZEZpZWxkcyA9IGNoaWxkcmVuPy5bMF0/LmNoaWxkcmVuIHx8IHByZXNldHM/LlswXS5jaGlsZHJlbj8uWzBdLmNoaWxkcmVuO1xuICAgIC8vIGdldCByYXcgY29uZmlnIGFzIEBQIGFuZCBvdGhlciBhbm5vdGF0aW9ucyBhcmUgcHJvY2Vzc2VkIGFuZCBkb24ndCBhcHBlYXIgaW4gdGhlIHJlc29sdmVkIGNvbmZpZy5cbiAgICAvLyAgRGVzdHJ1Y3R1cmUgXCJyYXdcIiBjaGlsZHJlbiBpbnRvIGFycmF5IHZhcjogXCJyYXdGaWVsZHNcIlxuICAgIC8vICBOT1RFOiB3aGVuIGNvbmZpZy5saXN0VHlwZSA9PSBcImFzc29jaWF0ZWRcIiwgdGhlIHByb3BlcnR5IGNhbiBiZSBmb3VuZCBpbiBlaXRoZXJcbiAgICAvLyAgICBjb25maWcudmFsdWUgKGV4OiBcIkBQIC5EZWNsYXJhbnRDaG9pY2VcIikgb3JcbiAgICAvLyAgICBjb25maWcuZGF0YXNvdXJjZSAoZXg6IFwiQEFTU09DSUFURUQgLkRlY2xhcmFudENob2ljZVwiKVxuICAgIC8vICBOZWl0aGVyIG9mIHRoZXNlIGFwcGVhciBpbiB0aGUgcmVzb2x2ZWQgKHRoaXMuY29uZmlnUHJvcHMkKVxuICAgIGNvbnN0IHJhd0NvbmZpZzogYW55ID0gcmF3TWV0YWRhdGE/LmNvbmZpZztcbiAgICBjb25zdCByYXdGaWVsZHMgPSByYXdDb25maWc/LmNoaWxkcmVuPy5bMF0/LmNoaWxkcmVuIHx8IHJhd0NvbmZpZz8ucHJlc2V0cz8uWzBdLmNoaWxkcmVuPy5bMF0/LmNoaWxkcmVuO1xuICAgIHRoaXMucmF3RmllbGRzID0gcmF3RmllbGRzO1xuICAgIC8vIEF0IHRoaXMgcG9pbnQsIGZpZWxkcyBoYXMgcmVzb2x2ZWRGaWVsZHMgYW5kIHJhd0ZpZWxkcyB3ZSBjYW4gdXNlXG5cbiAgICAvLyBzdGFydCBvZiBmcm9tIE5lYnVsYVxuICAgIC8vIGdldCBjb250ZXh0IG5hbWUgYW5kIHJlZmVyZW5jZUxpc3Qgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHByZXBhcmUgY29uZmlnIG9mIFBDb25uZWN0XG4gICAgLy8gY29uc3QgeyBjb250ZXh0TmFtZSwgcmVmZXJlbmNlTGlzdFN0ciwgcGFnZVJlZmVyZW5jZUZvclJvd3MgfSA9IGdldENvbnRleHQodGhpcy5wQ29ubiQpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRMaXN0ID0gZ2V0UmVmZXJlbmNlTGlzdCh0aGlzLnBDb25uJCk7XG4gICAgdGhpcy5wYWdlUmVmZXJlbmNlID0gYCR7dGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpfSR7cmVzb2x2ZWRMaXN0fWA7XG4gICAgdGhpcy5wQ29ubiQuc2V0UmVmZXJlbmNlTGlzdChyZXNvbHZlZExpc3QpO1xuXG4gICAgLy8gVGhpcyBnaXZlcyB1cCB0aGUgXCJwcm9wZXJ0aWVzXCIgd2UgbmVlZCB0byBtYXAgdG8gcm93L2NvbHVtbiB2YWx1ZXMgbGF0ZXJcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREYXRhID0gcG9wdWxhdGVSb3dLZXkocmVmZXJlbmNlTGlzdCk7XG5cbiAgICB0aGlzLnJlcXVlc3RlZFJlYWRPbmx5TW9kZSA9IHJlbmRlck1vZGUgPT09ICdSZWFkT25seSc7XG4gICAgdGhpcy5yZWFkT25seU1vZGUgPSByZW5kZXJNb2RlID09PSAnUmVhZE9ubHknO1xuICAgIHRoaXMuZWRpdGFibGVNb2RlID0gcmVuZGVyTW9kZSA9PT0gJ0VkaXRhYmxlJztcbiAgICBjb25zdCBpc0Rpc3BsYXlNb2RlRW5hYmxlZCA9IGRpc3BsYXlNb2RlID09PSAnRElTUExBWV9PTkxZJztcbiAgICB0aGlzLnNob3dBZGRSb3dCdXR0b24gPSAhdGhpcy5yZWFkT25seU1vZGUgJiYgIWhpZGVBZGRSb3c7XG4gICAgdGhpcy5hbGxvd0VkaXRpbmdJbk1vZGFsID1cbiAgICAgIChlZGl0TW9kZSA/IGVkaXRNb2RlID09PSAnbW9kYWwnIDogYWRkQW5kRWRpdFJvd3NXaXRoaW4gPT09ICdtb2RhbCcpICYmICEocmVuZGVyTW9kZSA9PT0gJ1JlYWRPbmx5JyB8fCBpc0Rpc3BsYXlNb2RlRW5hYmxlZCk7XG4gICAgY29uc3Qgc2hvd0RlbGV0ZUJ1dHRvbiA9IHRoaXMuZWRpdGFibGVNb2RlICYmICFoaWRlRGVsZXRlUm93O1xuICAgIHRoaXMuZGVmYXVsdFZpZXcgPSBlZGl0TW9kZUNvbmZpZyA/IGVkaXRNb2RlQ29uZmlnLmRlZmF1bHRWaWV3IDogdmlld0ZvckFkZEFuZEVkaXRNb2RhbDtcbiAgICB0aGlzLmJVc2VTZXBhcmF0ZVZpZXdGb3JFZGl0ID0gZWRpdE1vZGVDb25maWcgPyBlZGl0TW9kZUNvbmZpZy51c2VTZXBhcmF0ZVZpZXdGb3JFZGl0IDogdXNlU2VwYXJhdGVWaWV3Rm9yRWRpdDtcbiAgICB0aGlzLmVkaXRWaWV3ID0gZWRpdE1vZGVDb25maWcgPyBlZGl0TW9kZUNvbmZpZy5lZGl0VmlldyA6IHZpZXdGb3JFZGl0TW9kYWw7XG4gICAgLy8gY29uc3Qgc2hvd0RlbGV0ZUJ1dHRvbiA9ICF0aGlzLnJlYWRPbmx5TW9kZSAmJiAhaGlkZURlbGV0ZVJvdztcblxuICAgIC8vIE5lYnVsYSBoYXMgb3RoZXIgaGFuZGxpbmcgZm9yIGlzUmVhZE9ubHlNb2RlIGJ1dCBoYXMgQ29zbW9zLXNwZWNpZmljIGNvZGVcbiAgICAvLyAgc28gaWdub3JpbmcgdGhhdCBmb3Igbm93Li4uXG4gICAgLy8gZmllbGREZWZzIHdpbGwgYmUgYW4gYXJyYXkgd2hlcmUgZWFjaCBlbnRyeSB3aWxsIGhhdmUgYSBcIm5hbWVcIiB3aGljaCB3aWxsIGJlIHRoZVxuICAgIC8vICBcInJlc29sdmVkXCIgcHJvcGVydHkgbmFtZSAodGhhdCB3ZSBjYW4gdXNlIGFzIHRoZSBjb2xJZCkgdGhvdWdoIGl0J3Mgbm90IHJlYWxseVxuICAgIC8vICByZXNvbHZlZC4gVGhlIGJ1aWxkRmllbGRzRm9yVGFibGUgaGVscGVyIGp1c3QgcmVtb3ZlcyB0aGUgXCJAUCBcIiAod2hpY2ggaXMgd2hhdFxuICAgIC8vICBOZWJ1bGEgZG9lcykuIEl0IHdpbGwgYWxzbyBoYXZlIHRoZSBcImxhYmVsXCIsIGFuZCBcIm1ldGFcIiBjb250YWlucyB0aGUgb3JpZ2luYWwsXG4gICAgLy8gIHVuY2hhbmdlZCBjb25maWcgaW5mby4gRm9yIG5vdywgbXVjaCBvZiB0aGUgaW5mbyBoZXJlIGlzIGNhcnJpZWQgb3ZlciBmcm9tXG4gICAgLy8gIE5lYnVsYSBhbmQgd2UgbWF5IG5vdCBlbmQgdXAgdXNpbmcgaXQgYWxsLlxuICAgIHRoaXMuZmllbGREZWZzID0gYnVpbGRGaWVsZHNGb3JUYWJsZShyYXdGaWVsZHMsIHJlc29sdmVkRmllbGRzLCBzaG93RGVsZXRlQnV0dG9uKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZURlZmF1bHRQYWdlSW5zdHJ1Y3Rpb25zKCk7XG5cbiAgICAvLyBlbmQgb2YgZnJvbSBOZWJ1bGFcblxuICAgIC8vIEhlcmUsIHdlIHVzZSB0aGUgXCJuYW1lXCIgZmllbGQgaW4gZmllbGREZWZzIHNpbmNlIHRoYXQgaGFzIHRoZSBhc3NvaWNhdGVkIHByb3BlcnR5XG4gICAgLy8gIChpZiBvbmUgZXhpc3RzIGZvciB0aGUgZmllbGQpLiBJZiBubyBcIm5hbWVcIiwgdXNlIFwiY2VsbFJlbmRlcmVyXCIgKHR5cGljYWxseSBnZXQgREVMRVRFX0lDT04pXG4gICAgLy8gIGZvciBvdXIgY29sdW1ucy5cbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmZpZWxkRGVmcz8ubWFwKGZpZWxkID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5uYW1lID8gZmllbGQubmFtZSA6IGZpZWxkLmNlbGxSZW5kZXJlcjtcbiAgICB9KTtcblxuICAgIC8vIEFuZCBub3cgd2UgY2FuIHByb2Nlc3MgdGhlIHJlc29sdmVkRmllbGRzIHRvIGFkZCBpbiB0aGUgXCJuYW1lXCJcbiAgICAvLyAgZnJvbSBmcm9tIHRoZSBmaWVsZERlZnMuIFRoaXMgXCJuYW1lXCIgaXMgdGhlIHZhbHVlIHRoYXRcbiAgICAvLyAgd2UnbGwgc2hhcmUgdG8gY29ubmVjdCB0aGluZ3MgdG9nZXRoZXIgaW4gdGhlIHRhYmxlLlxuXG4gICAgdGhpcy5wcm9jZXNzZWRGaWVsZHMgPSBbXTtcblxuICAgIHRoaXMucHJvY2Vzc2VkRmllbGRzID0gcmVzb2x2ZWRGaWVsZHMubWFwKChmaWVsZCwgaSkgPT4ge1xuICAgICAgZmllbGQuY29uZmlnLm5hbWUgPSB0aGlzLmRpc3BsYXllZENvbHVtbnNbaV07IC8vIC5jb25maWdbXCJ2YWx1ZVwiXS5yZXBsYWNlKC8gLi9nLFwiX1wiKTsgICAvLyByZXBsYWNlIHNwYWNlIGRvdCB3aXRoIHVuZGVyc2NvcmVcbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9KTtcblxuICAgIC8vIGZvciBhZGRpbmcgcm93cyB0byB0YWJsZSB3aGVuIGVkaXRhYmxlIGFuZCBub3QgbW9kYWwgdmlld1xuICAgIGlmICh0aGlzLnByZXZSZWZlcmVuY2VMaXN0Lmxlbmd0aCAhPT0gdGhpcy5yZWZlcmVuY2VMaXN0Lmxlbmd0aCAmJiB0aGlzLmVkaXRhYmxlTW9kZSAmJiAhdGhpcy5hbGxvd0VkaXRpbmdJbk1vZGFsKSB7XG4gICAgICB0aGlzLmJ1aWxkRWxlbWVudHNGb3JUYWJsZSgpO1xuICAgIH1cblxuICAgIC8vIGZvciBlZGl0IGFuZCBhZGRpbmcgcm93cyBpbiBtb2RhbCB2aWV3IGFuZCB0byBnZW5lcmF0ZSByZWFkb25seSBsaXN0XG4gICAgaWYgKCFpc0VxdWFsKHRoaXMucHJldlJlZmVyZW5jZUxpc3QsIHRoaXMucmVmZXJlbmNlTGlzdCkgJiYgKHRoaXMucmVhZE9ubHlNb2RlIHx8IHRoaXMuYWxsb3dFZGl0aW5nSW5Nb2RhbCkpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVSb3dzRGF0YSgpO1xuICAgIH1cblxuICAgIHRoaXMucHJldlJlZmVyZW5jZUxpc3QgPSB0aGlzLnJlZmVyZW5jZUxpc3Q7XG5cbiAgICAvLyBUaGVzZSBhcmUgdGhlIGRhdGEgc3RydWN0dXJlcyByZWZlcnJlZCB0byBpbiB0aGUgaHRtbCBmaWxlLlxuICAgIC8vICBUaGVzZSBhcmUgdGhlIHJlbGF0aW9uc2hpcHMgdGhhdCBtYWtlIHRoZSB0YWJsZSB3b3JrXG4gICAgLy8gIGRpc3BsYXllZENvbHVtbnM6IGtleS92YWx1ZSBwYWlycyB3aGVyZSBrZXkgaXMgb3JkZXIgb2YgY29sdW1uIGFuZFxuICAgIC8vICAgIHZhbHVlIGlzIHRoZSBwcm9wZXJ0eSBzaG93biBpbiB0aGF0IGNvbHVtbi4gRXg6IDE6IFwiRmlyc3ROYW1lXCJcbiAgICAvLyAgcHJvY2Vzc2VkRmllbGRzOiBrZXkvdmFsdWUgcGFpcnMgd2hlcmUgZWFjaCBrZXkgaXMgb3JkZXIgb2YgY29sdW1uXG4gICAgLy8gICAgYW5kIGVhY2ggdmFsdWUgaXMgYW4gb2JqZWN0IG9mIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhhdFxuICAgIC8vICAgIGNvbHVtbi5cbiAgICAvLyAgcm93RGF0YTogYXJyYXkgb2YgZWFjaCByb3cncyBrZXkvdmFsdWUgcGFpcnMuIEluc2lkZSBlYWNoIHJvdyxcbiAgICAvLyAgICBlYWNoIGtleSBpcyBhbiBlbnRyeSBpbiBkaXNwbGF5ZWRDb2x1bW5zOiBleDogXCJGaXJzdE5hbWVcIjogXCJDaGFybGVzXCJcbiAgICAvLyAgICBFeDogeyAxOiB7Y29uZmlnOiB7bGFiZWw6IFwiRmlyc3QgTmFtZVwiLCByZWFkT25seTogdHJ1ZTogbmFtZTogXCJGaXJzdE5hbWVcIn19LCB0eXBlOiBcIlRleHRJbnB1dFwiIH1cbiAgICAvLyAgICBUaGUgXCJ0eXBlXCIgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNvbXBvbmVudCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBlZGl0aW5nICh3aGVuIGVkaXRpbmcgaXMgZW5hYmxlZClcbiAgICAvL1xuICAgIC8vICBOb3RlIHRoYXQgdGhlIFwicHJvcGVydHlcIiBzaG93biBpbiB0aGUgY29sdW1uIChcIkZpcnN0TmFtZVwiIGluIHRoZSBhYm92ZSBleGFtcGxlcykgaXMgd2hhdFxuICAgIC8vICB0aWVzIHRoZSAzIGRhdGEgc3RydWN0dXJlcyB0b2dldGhlci5cbiAgfVxuXG4gIGluaXRpYWxpemVEZWZhdWx0UGFnZUluc3RydWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmFsbG93RWRpdGluZ0luTW9kYWwpIHtcbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0TGlzdEFjdGlvbnMoKS5pbml0RGVmYXVsdFBhZ2VJbnN0cnVjdGlvbnMoXG4gICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0UmVmZXJlbmNlTGlzdCgpLFxuICAgICAgICAgIHRoaXMuZmllbGREZWZzLmZpbHRlcihpdGVtID0+IGl0ZW0ubmFtZSkubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtIEFuIGFyZ3VtZW50IGZvciAncHJvcGVydHlOYW1lcycgd2FzIG5vdCBwcm92aWRlZC5cbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0TGlzdEFjdGlvbnMoKS5pbml0RGVmYXVsdFBhZ2VJbnN0cnVjdGlvbnModGhpcy5wQ29ubiQuZ2V0UmVmZXJlbmNlTGlzdCgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRSZXN1bHRzVGV4dCgpIHtcbiAgICBjb25zdCByZWNvcmRzQ291bnQgPSB0aGlzLnJlYWRPbmx5TW9kZSA/IHRoaXMucm93RGF0YT8uZGF0YS5sZW5ndGggOiB0aGlzLnJlZmVyZW5jZUxpc3Q/Lmxlbmd0aDtcbiAgICByZXR1cm4gYCR7cmVjb3Jkc0NvdW50IHx8IDB9IHJlc3VsdCR7cmVjb3Jkc0NvdW50ID4gMSA/ICdzJyA6ICcnfWA7XG4gIH1cblxuICBzb3J0Q29tcGFyZShhLCBiKTogbnVtYmVyIHtcbiAgICBsZXQgYVZhbHVlID0gYVt0aGlzLmNvbXBhcmVSZWZdO1xuICAgIGxldCBiVmFsdWUgPSBiW3RoaXMuY29tcGFyZVJlZl07XG5cbiAgICBpZiAodGhpcy5jb21wYXJlVHlwZSA9PSAnRGF0ZScgfHwgdGhpcy5jb21wYXJlVHlwZSA9PSAnRGF0ZVRpbWUnKSB7XG4gICAgICBhVmFsdWUgPSBnZXRTZWNvbmRzKGFWYWx1ZSk7XG4gICAgICBiVmFsdWUgPSBnZXRTZWNvbmRzKGJWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcGFyZVJlZiA9PSAncHhSZWZPYmplY3RJbnNOYW1lJykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb21wYXJlQnlDb2x1bW5QeFJlZk9iamVjdEluc05hbWUoYVZhbHVlLCBiVmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICBzd2l0Y2ggKHRoaXMuYXJyb3dEaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgaWYgKCFhVmFsdWUgfHwgYVZhbHVlIDwgYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYlZhbHVlIHx8IGFWYWx1ZSA+IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGlmICghYlZhbHVlIHx8IGFWYWx1ZSA+IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFWYWx1ZSB8fCBhVmFsdWUgPCBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29tcGFyZUJ5Q29sdW1uUHhSZWZPYmplY3RJbnNOYW1lKGFWYWx1ZSwgYlZhbHVlKSB7XG4gICAgY29uc3QgcHJlZml4WCA9IGFWYWx1ZS5zcGxpdCgnLScpO1xuICAgIGNvbnN0IHByZWZpeFkgPSBiVmFsdWUuc3BsaXQoJy0nKTtcbiAgICBzd2l0Y2ggKHRoaXMuYXJyb3dEaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgaWYgKHByZWZpeFhbMF0gIT09IHByZWZpeFlbMF0pIHtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA8IHByZWZpeFlbMF0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA+IHByZWZpeFlbMF0pIHJldHVybiAxO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVmaXhYWzFdIC0gcHJlZml4WVsxXTtcbiAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICBpZiAocHJlZml4WFswXSAhPT0gcHJlZml4WVswXSkge1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdID4gcHJlZml4WVswXSkgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdIDwgcHJlZml4WVswXSkgcmV0dXJuIDE7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeFlbMV0gLSBwcmVmaXhYWzFdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlckRpc3BsYXkodHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgX2ZpbHRlcihldmVudCwgY29sdW1uRGF0YSkge1xuICAgIC8vIGFkZCBjbGlja0F3YXkgbGlzdGVuZXJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEgPSBjb2x1bW5EYXRhO1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNMYWJlbCQgPSBjb2x1bW5EYXRhLmNvbmZpZy5sYWJlbDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJEaXNwbGF5KGNvbHVtbkRhdGEudHlwZSk7XG5cbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyVmFyc1dpdGhDdXJyZW50KGNvbHVtbkRhdGEpO1xuXG4gICAgICB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgX2NsaWNrQXdheShldmVudDogYW55KSB7XG4gICAgbGV0IGJJblBvcFVwID0gZmFsc2U7XG5cbiAgICAvLyBydW4gdGhyb3VnaCBsaXN0IG9mIGVsZW1lbnRzIGluIHBhdGgsIGlmIG1lbnUgbm90IGluIHRoIHBhdGgsIHRoZW4gd2FudCB0b1xuICAgIC8vIGhpZGUgKHRvZ2dsZSkgdGhlIG1lbnVcbiAgICBjb25zdCBldmVudFBhdGggPSBldmVudC5wYXRoO1xuICAgIGZvciAobGV0IGV2ZW50SW5kZXggPSAwOyBldmVudEluZGV4IDwgZXZlbnRQYXRoLmxlbmd0aDsgZXZlbnRJbmRleCsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS5jbGFzc05hbWUgPT0gJ3BzZGstbW9kYWwtZmlsZS10b3AnIHx8XG4gICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS50YWdOYW1lID09ICdCVVRUT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS50YWdOYW1lID09ICdNQVQtT1BUSU9OJyB8fFxuICAgICAgICBldmVudFBhdGhbZXZlbnRJbmRleF0udGFnTmFtZSA9PSAnTUFULUlOUFVUJ1xuICAgICAgKSB7XG4gICAgICAgIGJJblBvcFVwID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYkluUG9wVXApIHtcbiAgICAgIC8vIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNUeXBlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gZXZlbnQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNEYXRlVmFsdWUoZXZlbnQsIHZhbHVlKSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IHZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zRGF0ZVRpbWVWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNUaW1lVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX29uRmlsdGVyQWN0aW9uQnV0dG9uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIC8vIG1vZGFsIGJ1dHRvbnNcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YSA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyV2l0aEluZm8oKTtcbiAgICAgICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJXaXRoSW5mbygpIHtcbiAgICBsZXQgYkZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmoucmVmID09PSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIGZpbHRlck9iai50eXBlID0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS50eXBlO1xuICAgICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPSB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQ7XG4gICAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJDtcblxuICAgICAgICBiRm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWJGb3VuZCkge1xuICAgICAgLy8gYWRkIGluXG4gICAgICBjb25zdCBmaWx0ZXJPYmo6IGFueSA9IHt9O1xuICAgICAgZmlsdGVyT2JqLnJlZiA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEuY29uZmlnLm5hbWU7XG4gICAgICBmaWx0ZXJPYmoudHlwZSA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEudHlwZTtcbiAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9IHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJDtcbiAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJDtcblxuICAgICAgdGhpcy5maWx0ZXJCeUNvbHVtbnMucHVzaChmaWx0ZXJPYmopO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBmaWx0ZXJzIGFuZCB1cGRhdGUgZmlsdGVyT24gaWNvblxuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb250YWluc0ZpbHRlclZhbHVlID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWU7XG4gICAgICBjb25zdCBjb250YWluc0ZpbHRlciA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlclJlZiA9IGZpbHRlck9iai5yZWY7XG4gICAgICBjb25zdCBmaWx0ZXJJbmRleCA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKGZpbHRlclJlZik7XG4gICAgICBjb25zdCBhckZpbHRlckltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdmaWx0ZXJPbkljb24nKTtcbiAgICAgIGNvbnN0IGZpbHRlckltZzogYW55ID0gYXJGaWx0ZXJJbWdbZmlsdGVySW5kZXhdO1xuICAgICAgaWYgKGNvbnRhaW5zRmlsdGVyVmFsdWUgPT0gJycgJiYgY29udGFpbnNGaWx0ZXIgIT0gJ251bGwnICYmIGNvbnRhaW5zRmlsdGVyICE9ICdub3RudWxsJykge1xuICAgICAgICAvLyBjbGVhciBpY29uXG4gICAgICAgIGZpbHRlckltZy5zcmMgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNob3cgaWNvblxuICAgICAgICBmaWx0ZXJJbWcuc3JjID0gdGhpcy5maWx0ZXJPblN2Z0ljb24kO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUZpbHRlclZhcnNXaXRoQ3VycmVudChjb2x1bW5EYXRhKSB7XG4gICAgLy8gZmluZCBjdXJyZW50IHJlZiwgaWYgZXhpc3RzLCBtb3ZlIGRhdGEgdG8gdmFyaWFibGUgdG8gZGlzcGxheVxuXG4gICAgbGV0IGJGb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLnJlZiA9PT0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXI7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZTtcblxuICAgICAgICBiRm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWJGb3VuZCkge1xuICAgICAgc3dpdGNoIChjb2x1bW5EYXRhLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnY29udGFpbnMnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyRGF0YShpdGVtOiBhbnkpIHtcbiAgICBsZXQgYktlZXAgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgIT0gJycgfHwgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID09ICdudWxsJyB8fCBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPT0gJ25vdG51bGwnKSB7XG4gICAgICAgIHN3aXRjaCAoZmlsdGVyT2JqLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgICAgICBiS2VlcCA9IGZpbHRlckRhdGFCeURhdGUoaXRlbSwgZmlsdGVyT2JqKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBiS2VlcCA9IGZpbHRlckRhdGFCeUNvbW1vbkZpZWxkcyhpdGVtLCBmaWx0ZXJPYmopO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgZG9uJ3Qga2VlcCBzdG9wIGZpbHRlcmluZ1xuICAgICAgaWYgKCFiS2VlcCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYktlZXA7XG4gIH1cblxuICBmaWx0ZXJTb3J0R3JvdXBCeSgpIHtcbiAgICBsZXQgdGhlRGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLnNsaWNlKCk7XG5cbiAgICAvLyBsYXN0IGZpbHRlciBjb25maWcgZGF0YSBpcyBnbG9iYWxcbiAgICB0aGVEYXRhID0gdGhlRGF0YS5maWx0ZXIodGhpcy5maWx0ZXJEYXRhLmJpbmQodGhpcykpO1xuXG4gICAgLy8gbGFzdCBzb3J0IGNvbmZpZyBkYXRhIGlzIGdsb2JhbFxuICAgIHRoZURhdGEuc29ydCh0aGlzLnNvcnRDb21wYXJlLmJpbmQodGhpcykpO1xuICAgIHRoaXMucm93RGF0YS5kYXRhID0gdGhlRGF0YTtcbiAgfVxuXG4gIF9oZWFkZXJTb3J0Q2xpY2soZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBpbWFnZXMgMCAtIGZpbHRlciwgMSAtIGFycm93LCAyIC0gbW9yZVxuXG4gICAgLyoqIENvbW1lbnRpbmcgdGhpcyBjb2RlIGZvciBub3cgYXMgaXQgaXMgZ2l2aW5nIGVycm9ycyBub3Qgc3VyZSBpZiBpdCBldmVyIHdvcmtlZCAqL1xuICAgIC8vIGxldCBhcnJvd0ltYWdlID0gZXZlbnQuc3JjRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJylbMV07XG4gICAgLy8gbGV0IGFycm93QXR0ciA9IGFycm93SW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvdycpO1xuXG4gICAgLy8gdGhpcy5jbGVhck91dEFycm93cyhldmVudCwgY29sdW1uRGF0YSk7XG5cbiAgICAvLyBzd2l0Y2ggKGFycm93QXR0cikge1xuICAgIC8vICAgY2FzZSAndXAnOlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9IHRoaXMuYXJyb3dEb3duU3ZnSWNvbiQ7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICdkb3duJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgY2FzZSAnZG93bic6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gJyc7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICdub25lJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgZGVmYXVsdDpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSB0aGlzLmFycm93VXBTdmdJY29uJDtcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zZXRBdHRyaWJ1dGUoJ2Fycm93JywgJ3VwJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vIH1cblxuICAgIHRoaXMuY29tcGFyZVR5cGUgPSBjb2x1bW5EYXRhLnR5cGU7XG4gICAgdGhpcy5jb21wYXJlUmVmID0gY29sdW1uRGF0YS5jb25maWcubmFtZTtcbiAgICAvLyB0aGlzLmFycm93RGlyZWN0aW9uID0gYXJyb3dJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93Jyk7XG4gICAgdGhpcy5hcnJvd0RpcmVjdGlvbiA9IHRoaXMuYXJyb3dEaXJlY3Rpb24gPT09ICd1cCcgPyAnZG93bicgOiAndXAnO1xuXG4gICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICB9XG5cbiAgX3Nob3dVbkdyb3VwQnkoY29sdW1uRGF0YSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKSB7XG4gICAgICBpZiAodmFsID09IGNvbHVtbkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2dyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCB0cnVlKTtcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIF91bkdyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCBmYWxzZSk7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICBjaGVja0dyb3VwQnlDb2x1bW4oZmllbGQsIGFkZCkge1xuICAgIGxldCBmb3VuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cEJ5Q29sdW1ucyQpIHtcbiAgICAgIGlmIChjb2x1bW4gPT09IGZpZWxkKSB7XG4gICAgICAgIGZvdW5kID0gdGhpcy5ncm91cEJ5Q29sdW1ucyQuaW5kZXhPZihjb2x1bW4sIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm91bmQgIT0gbnVsbCAmJiBmb3VuZCA+PSAwKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWRkKSB7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5wdXNoKGZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBfZ2V0R3JvdXBOYW1lKGZpZWxkTmFtZSkge1xuICAgIGZvciAobGV0IGZpZWxkSW5kZXggPSAwOyBmaWVsZEluZGV4IDwgdGhpcy5maWVsZHMkLmxlbmd0aDsgZmllbGRJbmRleCsrKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzJFtmaWVsZEluZGV4XTtcbiAgICAgIGlmIChmaWVsZC5jb25maWcubmFtZSA9PSBmaWVsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmNvbmZpZy5sYWJlbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgYWRkR3JvdXBzKGRhdGE6IGFueVtdLCBncm91cEJ5Q29sdW1uczogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgY29uc3Qgcm9vdEdyb3VwID0gbmV3IEdyb3VwKCk7XG4gICAgcm9vdEdyb3VwLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJsZXZlbChkYXRhLCAwLCBncm91cEJ5Q29sdW1ucywgcm9vdEdyb3VwKTtcbiAgfVxuXG4gIGdldFN1YmxldmVsKGRhdGE6IGFueVtdLCBsZXZlbDogbnVtYmVyLCBncm91cEJ5Q29sdW1uczogc3RyaW5nW10sIHBhcmVudDogR3JvdXApOiBhbnlbXSB7XG4gICAgaWYgKGxldmVsID49IGdyb3VwQnlDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMudW5pcXVlQnkoXG4gICAgICBkYXRhLm1hcChyb3cgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgR3JvdXAoKTtcbiAgICAgICAgcmVzdWx0LmxldmVsID0gbGV2ZWwgKyAxO1xuICAgICAgICByZXN1bHQucGFyZW50ID0gcGFyZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBsZXZlbDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0W2dyb3VwQnlDb2x1bW5zW2ldXSA9IHJvd1tncm91cEJ5Q29sdW1uc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLFxuICAgICAgSlNPTi5zdHJpbmdpZnlcbiAgICApO1xuXG4gICAgY29uc3QgY3VycmVudENvbHVtbiA9IGdyb3VwQnlDb2x1bW5zW2xldmVsXTtcbiAgICBsZXQgc3ViR3JvdXBzOiBhbnkgPSBbXTtcbiAgICBncm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICBjb25zdCByb3dzSW5Hcm91cCA9IGRhdGEuZmlsdGVyKHJvdyA9PiBncm91cFtjdXJyZW50Q29sdW1uXSA9PT0gcm93W2N1cnJlbnRDb2x1bW5dKTtcbiAgICAgIGdyb3VwLnRvdGFsQ291bnRzID0gcm93c0luR3JvdXAubGVuZ3RoO1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSB0aGlzLmdldFN1YmxldmVsKHJvd3NJbkdyb3VwLCBsZXZlbCArIDEsIGdyb3VwQnlDb2x1bW5zLCBncm91cCk7XG4gICAgICBzdWJHcm91cC51bnNoaWZ0KGdyb3VwKTtcbiAgICAgIHN1Ykdyb3VwcyA9IHN1Ykdyb3Vwcy5jb25jYXQoc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiBzdWJHcm91cHM7XG4gIH1cblxuICB1bmlxdWVCeShhLCBrZXkpIHtcbiAgICBjb25zdCBzZWVuID0ge307XG4gICAgcmV0dXJuIGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgayA9IGtleShpdGVtKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduLCBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHJldHVybiBzZWVuLmhhc093blByb3BlcnR5KGspID8gZmFsc2UgOiAoc2VlbltrXSA9IHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgaXNHcm91cChpbmRleCwgaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLmxldmVsO1xuICB9XG5cbiAgX2dyb3VwSGVhZGVyQ2xpY2socm93KSB7XG4gICAgcm93LmV4cGFuZGVkID0gIXJvdy5leHBhbmRlZDtcbiAgICAvLyB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IFwiXCI7XG4gICAgdGhpcy5wZXJmRmlsdGVyID0gcGVyZm9ybWFuY2Uubm93KCkudG9TdHJpbmcoKTtcbiAgICB0aGlzLnJvd0RhdGEuZmlsdGVyID0gdGhpcy5wZXJmRmlsdGVyO1xuICB9XG5cbiAgLy8gYmVsb3cgaXMgZm9yIGdyaWQgcm93IGdyb3VwaW5nXG4gIGN1c3RvbUZpbHRlclByZWRpY2F0ZShkYXRhOiBhbnkgfCBHcm91cCwgZmlsdGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF0YSBpbnN0YW5jZW9mIEdyb3VwID8gZGF0YS52aXNpYmxlIDogdGhpcy5nZXREYXRhUm93VmlzaWJsZVdpdGhGaWx0ZXIoZGF0YSwgZmlsdGVyKTtcbiAgfVxuXG4gIGdldERhdGFSb3dWaXNpYmxlKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGdyb3VwUm93cyA9IHRoaXMucm93RGF0YS5kYXRhLmZpbHRlcihyb3cgPT4ge1xuICAgICAgaWYgKCEocm93IGluc3RhbmNlb2YgR3JvdXApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgIGlmICghcm93W2NvbHVtbl0gfHwgIWRhdGFbY29sdW1uXSB8fCByb3dbY29sdW1uXSAhPT0gZGF0YVtjb2x1bW5dKSB7XG4gICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICBpZiAoZ3JvdXBSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGdyb3VwUm93c1swXSBhcyBHcm91cDtcbiAgICByZXR1cm4gcGFyZW50LnZpc2libGUgJiYgcGFyZW50LmV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGVXaXRoRmlsdGVyKGRhdGEsIGZpbHRlcikge1xuICAgIC8vIGZpc3QgY2hlY2sgaWYgcm93IGlzIHZpc2libGUgd2l0aCBncm91cGluZ1xuICAgIGxldCBiVmlzaWJsZSA9IHRoaXMuZ2V0RGF0YVJvd1Zpc2libGUoZGF0YSk7XG5cbiAgICBpZiAoYlZpc2libGUgJiYgZmlsdGVyICYmIGZpbHRlciAhPSAnJyAmJiBmaWx0ZXIgIT0gdGhpcy5wZXJmRmlsdGVyKSB7XG4gICAgICAvLyBub3cgY2hlY2sgaWYgcm93IGlzIGZpbHRlcmVkLlxuXG4gICAgICAvLyBhc3N1bWUgbm90IHRoZXJlIHVubGVzcyB3ZSBmaW5kIGl0XG4gICAgICBiVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zKSB7XG4gICAgICAgIC8vIGZpbHRlciBpcyBsb3dlciBjYXNlXG4gICAgICAgIGlmIChkYXRhW2NvbF0gJiYgZGF0YVtjb2xdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlcikgPj0gMCkge1xuICAgICAgICAgIGJWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiVmlzaWJsZTtcbiAgfVxuXG4gIGdldERpc3BsYXlDb2x1bW5zKGZpZWxkcyA9IFtdKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5tYXAoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIGxldCB0aGVGaWVsZCA9IGZpZWxkLmNvbmZpZy52YWx1ZS5zdWJzdHJpbmcoZmllbGQuY29uZmlnLnZhbHVlLmluZGV4T2YoJyAnKSArIDEpO1xuICAgICAgaWYgKHRoZUZpZWxkLmluZGV4T2YoJy4nKSA9PSAwKSB7XG4gICAgICAgIHRoZUZpZWxkID0gdGhlRmllbGQuc3Vic3RyaW5nKDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlRmllbGQ7XG4gICAgfSk7XG4gIH1cblxuICBfZ2V0SWNvblN0eWxlKGxldmVsKTogc3RyaW5nIHtcbiAgICBsZXQgc1JldHVybiA9ICcnO1xuICAgIGxldCBuTGV2ZWwgPSBwYXJzZUludChsZXZlbCwgMTApO1xuICAgIG5MZXZlbC0tO1xuICAgIG5MZXZlbCAqPSAxNTtcbiAgICBzUmV0dXJuID0gYHBhZGRpbmctbGVmdDogJHtuTGV2ZWx9cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGVgO1xuXG4gICAgcmV0dXJuIHNSZXR1cm47XG4gIH1cblxuICAvLyBDYWxsYmFjayBwYXNzZWQgd2hlbiBzdWJzY3JpYmluZyB0byBzdG9yZSBjaGFuZ2VcbiAgb25TdGF0ZUNoYW5nZSgpIHtcbiAgICB0aGlzLmNoZWNrQW5kVXBkYXRlKCk7XG4gIH1cblxuICAvLyByZXR1cm4gdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHNob3duIGFzIHRoZSBjb250ZW50cyBmb3IgdGhlIGdpdmVuIHJvdyBkYXRhXG4gIC8vICBvZiB0aGUgZ2l2ZW4gcm93IGZpZWxkXG4gIGdldFJvd1ZhbHVlKGluUm93RGF0YTogT2JqZWN0LCBpbkNvbEtleTogc3RyaW5nKTogYW55IHtcbiAgICAvLyBTZWUgd2hhdCBkYXRhIChpZiBhbnkpIHdlIGhhdmUgdG8gZGlzcGxheVxuICAgIGNvbnN0IHJlZktleXM6IHN0cmluZ1tdID0gaW5Db2xLZXkuc3BsaXQoJy4nKTtcbiAgICBsZXQgdmFsQnVpbGRlciA9IGluUm93RGF0YTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICB2YWxCdWlsZGVyID0gdmFsQnVpbGRlcltrZXldO1xuICAgIH1cbiAgICByZXR1cm4gdmFsQnVpbGRlcjtcbiAgfVxuXG4gIGdlbmVyYXRlUm93c0RhdGEoKSB7XG4gICAgY29uc3QgeyBkYXRhUGFnZU5hbWUsIHJlZmVyZW5jZUxpc3QgfSA9IHRoaXMuY29uZmlnUHJvcHMkO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuICAgIC8vIGlmIGRhdGFQYWdlTmFtZSBwcm9wZXJ0eSB2YWx1ZSBleGlzdHMgdGhlbiBtYWtlIGEgZGF0YXBhZ2UgZmV0Y2ggY2FsbCBhbmQgZ2V0IHRoZSBsaXN0IG9mIGRhdGEuXG4gICAgaWYgKGRhdGFQYWdlTmFtZSkge1xuICAgICAgdGhpcy5kYXRhUGFnZVNlcnZpY2UuZ2V0RGF0YVBhZ2VEYXRhKGRhdGFQYWdlTmFtZSwgdGhpcy5wYXJhbWV0ZXJzLCBjb250ZXh0KS50aGVuKGxpc3REYXRhID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybWF0Um93c0RhdGEobGlzdERhdGEpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMucm93RGF0YSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoZGF0YSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlZmVyZW5jZUxpc3QgcHJvcCBoYXMgdGhlIEpTT04gZGF0YSBmb3IgZWFjaCByb3cgdG8gYmUgZGlzcGxheWVkXG4gICAgICAvLyAgaW4gdGhlIHRhYmxlLiBTbywgaXRlcmF0ZSBvdmVyIHJlZmVyZW5jZUxpc3QgdG8gY3JlYXRlIHRoZSBkYXRhUm93cyB0aGF0XG4gICAgICAvLyAgd2UncmUgdXNpbmcgYXMgdGhlIHRhYmxlJ3MgZGF0YVNvdXJjZVxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybWF0Um93c0RhdGEocmVmZXJlbmNlTGlzdCk7XG4gICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLnJvd0RhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFJvd3NEYXRhKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YT8ubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5yZWR1Y2UoKGRhdGFGb3JSb3csIGNvbEtleSkgPT4ge1xuICAgICAgICBkYXRhRm9yUm93W2NvbEtleV0gPSB0aGlzLmdldFJvd1ZhbHVlKGl0ZW0sIGNvbEtleSk7XG4gICAgICAgIHJldHVybiBkYXRhRm9yUm93O1xuICAgICAgfSwge30pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkUmVjb3JkKCkge1xuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZ0luTW9kYWwgJiYgdGhpcy5kZWZhdWx0Vmlldykge1xuICAgICAgdGhpcy5wQ29ubiRcbiAgICAgICAgLmdldEFjdGlvbnNBcGkoKVxuICAgICAgICAub3BlbkVtYmVkZGVkRGF0YU1vZGFsKFxuICAgICAgICAgIHRoaXMuZGVmYXVsdFZpZXcsXG4gICAgICAgICAgdGhpcy5wQ29ubiQgYXMgYW55LFxuICAgICAgICAgIHRoaXMucmVmZXJlbmNlTGlzdFN0cixcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZUxpc3QubGVuZ3RoLFxuICAgICAgICAgIFBDb3JlLmdldENvbnN0YW50cygpLlJFU09VUkNFX1NUQVRVUy5DUkVBVEUsXG4gICAgICAgICAgdGhpcy50YXJnZXRDbGFzc0xhYmVsXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucENvbm4kLmdldExpc3RBY3Rpb25zKCkuaW5zZXJ0KHsgY2xhc3NJRDogdGhpcy5jb250ZXh0Q2xhc3MgfSwgdGhpcy5yZWZlcmVuY2VMaXN0Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5wQ29ubiQuY2xlYXJFcnJvck1lc3NhZ2VzKHtcbiAgICAgIHByb3BlcnR5OiB0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCk/LnJlZmVyZW5jZUxpc3Q/LnN1YnN0cmluZygxKVxuICAgIH0pO1xuICB9XG5cbiAgZWRpdFJlY29yZChkYXRhLCBpbmRleCkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLnBDb25uJFxuICAgICAgICAuZ2V0QWN0aW9uc0FwaSgpXG4gICAgICAgIC5vcGVuRW1iZWRkZWREYXRhTW9kYWwoXG4gICAgICAgICAgdGhpcy5iVXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCA/IHRoaXMuZWRpdFZpZXcgOiB0aGlzLmRlZmF1bHRWaWV3LFxuICAgICAgICAgIHRoaXMucENvbm4kIGFzIGFueSxcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZUxpc3RTdHIsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUkVTT1VSQ0VfU1RBVFVTLlVQREFURSxcbiAgICAgICAgICB0aGlzLnRhcmdldENsYXNzTGFiZWxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVSZWNvcmQoaW5kZXgpIHtcbiAgICB0aGlzLnBDb25uJC5nZXRMaXN0QWN0aW9ucygpLmRlbGV0ZUVudHJ5KGluZGV4KTtcbiAgfVxuXG4gIGJ1aWxkRWxlbWVudHNGb3JUYWJsZSgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICBjb25zdCBlbGVEYXRhOiBhbnkgPSBbXTtcbiAgICB0aGlzLnJlZmVyZW5jZUxpc3QuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGE6IGFueSA9IFtdO1xuICAgICAgdGhpcy5yYXdGaWVsZHM/LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUxpc3REYXRhID0gZ2V0UmVmZXJlbmNlTGlzdCh0aGlzLnBDb25uJCk7XG4gICAgICAgIGNvbnN0IGlzRGF0YXBhZ2UgPSByZWZlcmVuY2VMaXN0RGF0YS5zdGFydHNXaXRoKCdEXycpO1xuICAgICAgICBjb25zdCBwYWdlUmVmZXJlbmNlVmFsdWUgPSBpc0RhdGFwYWdlID8gYCR7cmVmZXJlbmNlTGlzdERhdGF9WyR7aW5kZXh9XWAgOiBgJHt0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCl9JHtyZWZlcmVuY2VMaXN0RGF0YX1bJHtpbmRleH1dYDtcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgIG1ldGE6IGl0ZW0sXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6IHBhZ2VSZWZlcmVuY2VWYWx1ZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxpc3Q6IHJlZmVyZW5jZUxpc3REYXRhLFxuICAgICAgICAgICAgaGFzRm9ybTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmlldyA9IFBDb3JlLmNyZWF0ZVBDb25uZWN0KGNvbmZpZyk7XG4gICAgICAgIGRhdGEucHVzaCh2aWV3KTtcbiAgICAgIH0pO1xuICAgICAgZWxlRGF0YS5wdXNoKGRhdGEpO1xuICAgIH0pO1xuICAgIHRoaXMuZWxlbWVudHNEYXRhID0gZWxlRGF0YTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImJWaXNpYmxlJFwiPlxuICA8ZGl2IGNsYXNzPVwic2ltcGxlLXRhYmxlLXdyYXBwZXJcIj5cbiAgICA8aDMgKm5nSWY9XCJsYWJlbFwiIGNsYXNzTmFtZT1cImxhYmVsXCIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZFwiPlxuICAgICAge3sgbGFiZWwgfX0gPHNwYW4gY2xhc3M9XCJyZXN1bHRzLWNvdW50XCI+e3sgZ2V0UmVzdWx0c1RleHQoKSB9fTwvc3Bhbj5cbiAgICA8L2gzPlxuICAgIDx0YWJsZSAqbmdJZj1cInJlYWRPbmx5TW9kZSB8fCBhbGxvd0VkaXRpbmdJbk1vZGFsXCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInJvd0RhdGFcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIiBpZD1cInJlYWRvbmx5LXRhYmxlXCIgbWF0U29ydD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgcHJvY2Vzc2VkRmllbGRzXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLmNvbmZpZy5uYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIChjbGljayk9XCJfaGVhZGVyU29ydENsaWNrKCRldmVudCwgZENvbClcIiBhcnJvd1Bvc2l0aW9uPVwiYmVmb3JlXCI+XG4gICAgICAgICAgPGRpdj57eyBkQ29sLmNvbmZpZy5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItZmlsdGVyXCI+XG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1maWx0ZXItc3ZnLWljb25cIiBuYW1lPVwiZmlsdGVyT25JY29uXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJncm91cE1lbnVcIj5cbiAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgbWVudVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNncm91cE1lbnU+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2dyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+R3JvdXAgQnk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl91bkdyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+VW5ncm91cDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2ZpbHRlcigkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZmlsdGVyU3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkRlbGV0ZUljb25cIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFsbG93RWRpdGluZ0luTW9kYWxcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGluZGV4IGFzIGpcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaWNvblwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidXRpbGl0eU1lbnVcIj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay11dGlsaXR5LWNhcmQtYWN0aW9ucy1zdmctaWNvblwiIHNyYz1cInt7IHNldHRpbmdzU3ZnSWNvbiQgfX1cIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG1hdC1tZW51ICN1dGlsaXR5TWVudT1cIm1hdE1lbnVcIiBvdmVybGFwVHJpZ2dlcj1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0UmVjb3JkKGVsZW1lbnQsIGopXCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlUmVjb3JkKGopXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuICAgIDx0YWJsZSAqbmdJZj1cImVkaXRhYmxlTW9kZSAmJiAhYWxsb3dFZGl0aW5nSW5Nb2RhbFwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJlbGVtZW50c0RhdGFcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIiBpZD1cImVkaXRhYmxlLXRhYmxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkRGVmczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZENvbC5uYW1lICE9ICdEZWxldGVJY29uJ1wiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5uYW1lXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInBzZGstbWF0LWhlYWRlclwiPnt7IGRDb2wubGFiZWwgfX08L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgICAgICAgICBbbmFtZV09XCJlbGVtZW50W2ldLmdldFBDb25uZWN0KCkuZ2V0Q29tcG9uZW50TmFtZSgpXCJcbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICBwQ29ubiQ6IGVsZW1lbnRbaV0uZ2V0UENvbm5lY3QoKSxcbiAgICAgICAgICAgICAgICBmb3JtR3JvdXAkOiBmb3JtR3JvdXAkXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBlcnJvck1zZz1cIlRhYmxlIHdhbnRzIGNvbXBvbmVudCBub3QgeWV0IGF2YWlsYWJsZToge3sgZWxlbWVudFtpXS5nZXRQQ29ubmVjdCgpLmdldENvbXBvbmVudE5hbWUoKSB9fVwiXG4gICAgICAgICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkRlbGV0ZUljb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgalwiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJkZWxldGVSZWNvcmQoailcIj5cbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLXV0aWxpdHktY2FyZC1hY3Rpb24tc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51SWNvbk92ZXJyaWRlJCB9fVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgPC90YWJsZT5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay1uby1yZWNvcmRzXCIgaWQ9XCJuby1yZWNvcmRzXCIgKm5nSWY9XCJlZGl0YWJsZU1vZGUgJiYgcmVmZXJlbmNlTGlzdD8ubGVuZ3RoID09PSAwXCI+Tm8gUmVjb3JkcyBGb3VuZC48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay1uby1yZWNvcmRzXCIgaWQ9XCJuby1yZWNvcmRzXCIgKm5nSWY9XCJyZWFkT25seU1vZGUgJiYgcm93RGF0YT8uZGF0YT8ubGVuZ3RoID09PSAwXCI+Tm8gUmVjb3JkcyBGb3VuZC48L2Rpdj5cbiAgPC9kaXY+XG4gIDxidXR0b24gKm5nSWY9XCJzaG93QWRkUm93QnV0dG9uXCIgbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTZweFwiIChjbGljayk9XCJhZGRSZWNvcmQoKVwiPisgQWRkPC9idXR0b24+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSBwb3Agb3ZlcnMgZm9yIGZpbHRlcnMtLT5cbjxkaXYgKm5nSWY9XCJiU2hvd0ZpbHRlclBvcG92ZXIkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWZpbGUtdG9wXCI+XG4gICAgPGg0PlxuICAgICAgRmlsdGVyOjxiPiB7eyBmaWx0ZXJDb250YWluc0xhYmVsJCB9fTwvYj5cbiAgICA8L2g0PlxuICAgIDxkaXYgKm5nSWY9XCJiQ29udGFpbnMkXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVHlwZSRcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1R5cGUoJGV2ZW50KVwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiY29udGFpbnNcIj5Db250YWluczwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImVxdWFsc1wiPkVxdWFsczwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cInN0YXJ0c3dpdGhcIj5TdGFydHMgd2l0aDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVmFsdWUoJGV2ZW50KVwiIC8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cImJEYXRlVGltZSRcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNUeXBlJFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVHlwZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJub3RlcXVhbFwiPmlzIG5vdCBlcXVhbCB0bzwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImFmdGVyXCI+YWZ0ZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJiZWZvcmVcIj5iZWZvcmU8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJudWxsXCI+aXMgbnVsbDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdG51bGxcIj5pcyBub3QgbnVsbDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZSQgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPT0gJ251bGwnICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT0gJ25vdG51bGwnXCIgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5EYXRlPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgI2RhdGVJbnB1dFxuICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBlZ2FkYXRlXCJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCJcbiAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNEYXRlVmFsdWUoJGV2ZW50LCBkYXRlSW5wdXQudmFsdWUpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwZWdhZGF0ZVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BlZ2FkYXRlIFtzdGFydEF0XT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc0RhdGVUaW1lJCAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9PSAnbnVsbCcgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPSAnbm90bnVsbCdcIiBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LWxhYmVsPkRhdGUgdGltZTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNEYXRlVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzVGltZSQgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPT0gJ251bGwnICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT0gJ25vdG51bGwnXCIgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5UaW1lPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGltZVwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICBuYW1lPVwiQWN0aW9uQnV0dG9uc1wiXG4gICAgICBbcHJvcHNdPVwieyBhck1haW5CdXR0b25zJDogYXJGaWx0ZXJNYWluQnV0dG9ucyQsIGFyU2Vjb25kYXJ5QnV0dG9ucyQ6IGFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgW291dHB1dEV2ZW50c109XCJ7IGFjdGlvbkJ1dHRvbkNsaWNrOiBfb25GaWx0ZXJBY3Rpb25CdXR0b25DbGljayB9XCJcbiAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
812
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXRhYmxlLW1hbnVhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvdGVtcGxhdGUvc2ltcGxlLXRhYmxlLW1hbnVhbC9zaW1wbGUtdGFibGUtbWFudWFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9zaW1wbGUtdGFibGUtbWFudWFsL3NpbXBsZS10YWJsZS1tYW51YWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFB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d0JBQ2pDLGFBQWEsRUFBRSxpQkFBaUI7d0JBQ2hDLE9BQU8sRUFBRSxJQUFJO3FCQUNkO2lCQUNGLENBQUM7Z0JBQ0YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO0lBQzlCLENBQUM7K0dBMzZCVSwwQkFBMEI7bUdBQTFCLDBCQUEwQixpTEFDMUIsT0FBTyxnRENqRnBCLG8xUUFzS0EsOGdGRG5HSSxZQUFZLDhUQUNaLGNBQWMsdTFDQUNkLGVBQWUsdVlBQ2YsYUFBYSxnaEJBQ2IsYUFBYSxpMUJBQ2Isa0JBQWtCLCtmQUNsQixtQkFBbUIsd2xCQUNuQixlQUFlLDBPQUNmLGVBQWUsNmpCQUNmLGNBQWMsc1pBQ0csd0JBQXdCOzs0RkFHaEMsMEJBQTBCO2tCQW5CdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FHdkIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixrQkFBa0I7d0JBQ2xCLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO3FCQUMzQzs2SUFHbUIsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUVULE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbCc7XG5cbmltcG9ydCB7IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbmd1bGFyUENvbm5lY3REYXRhLCBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9hbmd1bGFyLXBjb25uZWN0JztcbmltcG9ydCB7IERhdGFwYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9kYXRhcGFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFJlZmVyZW5jZUxpc3QgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9maWVsZC1ncm91cC11dGlscyc7XG5pbXBvcnQgeyBidWlsZEZpZWxkc0ZvclRhYmxlLCBldmFsdWF0ZUFsbG93Um93QWN0aW9uLCBmaWx0ZXJEYXRhQnlDb21tb25GaWVsZHMsIGZpbHRlckRhdGFCeURhdGUsIGdldENvbnRleHQgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBnZXRTZWNvbmRzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvY29tbW9uJztcblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcblxuaW50ZXJmYWNlIFNpbXBsZVRhYmxlTWFudWFsUHJvcHMge1xuICAvLyBJZiBhbnksIGVudGVyIGFkZGl0aW9uYWwgcHJvcHMgdGhhdCBvbmx5IGV4aXN0IG9uIHRoaXMgY29tcG9uZW50XG4gIHZpc2liaWxpdHk/OiBib29sZWFuO1xuICBncm91cGluZz86IGFueTtcbiAgcmVmZXJlbmNlTGlzdD86IGFueVtdO1xuICBjaGlsZHJlbj86IGFueVtdO1xuICByZW5kZXJNb2RlPzogc3RyaW5nO1xuICBwcmVzZXRzPzogYW55W107XG4gIGxhYmVsPzogc3RyaW5nO1xuICBzaG93TGFiZWw/OiBib29sZWFuO1xuICBkYXRhUGFnZU5hbWU/OiBzdHJpbmc7XG4gIGNvbnRleHRDbGFzcz86IHN0cmluZztcbiAgcHJvcGVydHlMYWJlbD86IHN0cmluZztcbiAgZmllbGRNZXRhZGF0YT86IGFueTtcbiAgYWxsb3dBY3Rpb25zPzogYW55O1xuICBhbGxvd1RhYmxlRWRpdD86IGJvb2xlYW47XG4gIGFsbG93Um93RGVsZXRlPzogYW55O1xuICBlZGl0TW9kZT86IHN0cmluZztcbiAgYWRkQW5kRWRpdFJvd3NXaXRoaW4/OiBhbnk7XG4gIHZpZXdGb3JBZGRBbmRFZGl0TW9kYWw/OiBhbnk7XG4gIGVkaXRNb2RlQ29uZmlnPzogYW55O1xuICBkaXNwbGF5TW9kZT86IHN0cmluZztcbiAgdXNlU2VwYXJhdGVWaWV3Rm9yRWRpdDogYW55O1xuICB2aWV3Rm9yRWRpdE1vZGFsOiBhbnk7XG4gIHRhcmdldENsYXNzTGFiZWw6IHN0cmluZztcbn1cblxuY2xhc3MgR3JvdXAge1xuICBsZXZlbCA9IDA7XG4gIHBhcmVudDogR3JvdXA7XG4gIGV4cGFuZGVkID0gdHJ1ZTtcbiAgdG90YWxDb3VudHMgPSAwO1xuICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMucGFyZW50IHx8ICh0aGlzLnBhcmVudC52aXNpYmxlICYmIHRoaXMucGFyZW50LmV4cGFuZGVkKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2ltcGxlLXRhYmxlLW1hbnVhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW1wbGUtdGFibGUtbWFudWFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2ltcGxlLXRhYmxlLW1hbnVhbC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRTb3J0TW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gICAgTWF0T3B0aW9uTW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBmb3J3YXJkUmVmKCgpID0+IENvbXBvbmVudE1hcHBlckNvbXBvbmVudClcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTaW1wbGVUYWJsZU1hbnVhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0OiBNYXRTb3J0O1xuXG4gIEBJbnB1dCgpIHBDb25uJDogdHlwZW9mIFBDb25uZWN0O1xuICBASW5wdXQoKSBmb3JtR3JvdXAkOiBGb3JtR3JvdXA7XG5cbiAgLy8gVXNlZCB3aXRoIEFuZ3VsYXJQQ29ubmVjdFxuICBhbmd1bGFyUENvbm5lY3REYXRhOiBBbmd1bGFyUENvbm5lY3REYXRhID0ge307XG4gIGNvbmZpZ1Byb3BzJDogU2ltcGxlVGFibGVNYW51YWxQcm9wcztcbiAgZmllbGRzJDogYW55W107XG5cbiAgYlZpc2libGUkID0gdHJ1ZTtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgcm93RGF0YTogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIG9yaWdpbmFsRGF0YTogYW55W10gPSBbXTtcbiAgcHJvY2Vzc2VkRmllbGRzOiBhbnlbXSA9IFtdO1xuICBmaWVsZERlZnM6IGFueVtdID0gW107XG4gIHJlcXVlc3RlZFJlYWRPbmx5TW9kZSA9IGZhbHNlO1xuICByZWFkT25seU1vZGUgPSBmYWxzZTtcbiAgZWRpdGFibGVNb2RlOiBib29sZWFuO1xuICBtZW51SWNvbk92ZXJyaWRlJDogc3RyaW5nO1xuICBwYWdlUmVmZXJlbmNlOiBzdHJpbmc7XG4gIHJlZmVyZW5jZUxpc3Q6IGFueTtcbiAgY29udGV4dENsYXNzOiBhbnk7XG4gIHNob3dBZGRSb3dCdXR0b246IGJvb2xlYW47XG4gIHByZXZSZWZlcmVuY2VMaXN0OiBhbnlbXSA9IFtdO1xuICBlbGVtZW50c0RhdGE6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xuICBvcmlnaW5hbEVsZW1lbnRzRGF0YTogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIHJhd0ZpZWxkczogYW55O1xuICBsYWJlbD86IHN0cmluZyA9ICcnO1xuICBzZWFyY2hJY29uJDogc3RyaW5nO1xuXG4gIGJTaG93U2VhcmNoJCA9IGZhbHNlO1xuICBiQ29sdW1uUmVvcmRlciQgPSBmYWxzZTtcbiAgYkdyb3VwaW5nJCA9IGZhbHNlO1xuXG4gIHBlcmZGaWx0ZXI6IHN0cmluZztcbiAgc2VhcmNoRmlsdGVyOiBzdHJpbmc7XG5cbiAgbWVudVN2Z0ljb24kOiBzdHJpbmc7XG4gIGFycm93U3ZnSWNvbiQgPSAnJztcbiAgYXJyb3dEb3duU3ZnSWNvbiQ6IHN0cmluZztcbiAgYXJyb3dVcFN2Z0ljb24kOiBzdHJpbmc7XG5cbiAgZmlsdGVyU3ZnSWNvbiQ6IHN0cmluZztcbiAgZmlsdGVyT25TdmdJY29uJDogc3RyaW5nO1xuICBncm91cEJ5U3ZnSWNvbiQ6IHN0cmluZztcblxuICBncm91cEJ5Q29sdW1ucyQ6IHN0cmluZ1tdID0gW107XG4gIGNvbXBhcmVUeXBlOiBzdHJpbmc7XG4gIGNvbXBhcmVSZWY6IHN0cmluZztcbiAgYXJyb3dEaXJlY3Rpb24gPSAnZG93bic7XG4gIGZpbHRlckJ5Q29sdW1uczogYW55W10gPSBbXTtcbiAgY3VycmVudEZpbHRlclJlZkRhdGE6IGFueTtcbiAgZmlsdGVyQ29udGFpbnNMYWJlbCQgPSAnJztcbiAgZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gIGZpbHRlckNvbnRhaW5zVmFsdWUkOiBhbnk7XG4gIGJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcbiAgYkNvbnRhaW5zJCA9IHRydWU7XG4gIGJEYXRlVGltZSQgPSBmYWxzZTtcblxuICBiSXNEYXRlJCA9IGZhbHNlO1xuICBiSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgYklzVGltZSQgPSBmYWxzZTtcbiAgY3VycmVudEZpbHRlckltYWdlRWw6IGFueTtcblxuICBhckZpbHRlck1haW5CdXR0b25zJDogYW55W10gPSBbXTtcbiAgYXJGaWx0ZXJTZWNvbmRhcnlCdXR0b25zJDogYW55W10gPSBbXTtcbiAgc2VsZWN0aW9uTW9kZTogc3RyaW5nO1xuICBzaW5nbGVTZWxlY3Rpb25Nb2RlOiBib29sZWFuO1xuICBtdWx0aVNlbGVjdGlvbk1vZGU6IGJvb2xlYW47XG4gIHJvd0lEOiBhbnk7XG4gIHJlc3BvbnNlOiBhbnk7XG4gIGNvbXBvc2l0ZUtleXM6IGFueTtcbiAgcGFyYW1ldGVyczogYW55O1xuICBhbGxvd0VkaXRpbmdJbk1vZGFsID0gZmFsc2U7XG4gIGRlZmF1bHRWaWV3OiBhbnk7XG4gIHJlZmVyZW5jZUxpc3RTdHI6IGFueTtcbiAgYlVzZVNlcGFyYXRlVmlld0ZvckVkaXQ6IGFueTtcbiAgZWRpdFZpZXc6IGFueTtcbiAgc2V0dGluZ3NTdmdJY29uJDogc3RyaW5nO1xuXG4gIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgdGFyZ2V0Q2xhc3NMYWJlbDogc3RyaW5nO1xuICBsb2NhbGl6ZWRWYWwgPSBQQ29yZS5nZXRMb2NhbGVVdGlscygpLmdldExvY2FsZVZhbHVlO1xuICBsb2NhbGVDYXRlZ29yeSA9ICdTaW1wbGVUYWJsZSc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYW5ndWxhclBDb25uZWN0OiBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLFxuICAgIHB1YmxpYyB1dGlsczogVXRpbHMsXG4gICAgcHJpdmF0ZSBkYXRhUGFnZVNlcnZpY2U6IERhdGFwYWdlU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50c0RhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oW10pO1xuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG4gICAgdGhpcy5jb25maWdQcm9wcyQgPSB0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpIGFzIFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG4gICAgLy8gVGhlbiwgY29udGludWUgb24gd2l0aCBvdGhlciBpbml0aWFsaXphdGlvblxuICAgIHRoaXMubWVudUljb25PdmVycmlkZSQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCd0cmFzaCcsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICAvLyBjYWxsIGNoZWNrQW5kVXBkYXRlIHdoZW4gaW5pdGlhbGl6aW5nXG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICAgIHRoaXMuZmlsdGVyU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdmaWx0ZXInLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5maWx0ZXJPblN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnZmlsdGVyLW9uJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuZ3JvdXBCeVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygncm93JywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuYkdyb3VwaW5nJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKHRoaXMuY29uZmlnUHJvcHMkLmdyb3VwaW5nKTtcbiAgICB0aGlzLm1lbnVTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ21vcmUnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG5cbiAgICB0aGlzLmFyRmlsdGVyTWFpbkJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ3N1Ym1pdCcsIGpzQWN0aW9uOiAnc3VibWl0JywgbmFtZTogJ1N1Ym1pdCcgfSk7XG4gICAgdGhpcy5hckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ2NhbmNlbCcsIGpzQWN0aW9uOiAnY2FuY2VsJywgbmFtZTogJ0NhbmNlbCcgfSk7XG5cbiAgICB0aGlzLnNlYXJjaEljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnc2VhcmNoJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgdGhpcy5zZXR0aW5nc1N2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnbW9yZScsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0FuZFVwZGF0ZSgpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkXG4gICAgLy8gdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAgIGNvbnN0IGJVcGRhdGVTZWxmID0gdGhpcy5hbmd1bGFyUENvbm5lY3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKHRoaXMpO1xuXG4gICAgLy8gT05MWSBjYWxsIHVwZGF0ZVNlbGYgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGVcbiAgICBpZiAoYlVwZGF0ZVNlbGYpIHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHVwZGF0ZVNlbGZcbiAgdXBkYXRlU2VsZigpOiB2b2lkIHtcbiAgICAvLyBtb3ZlZCB0aGlzIGZyb20gbmdPbkluaXQoKSBhbmQgY2FsbCB0aGlzIGZyb20gdGhlcmUgaW5zdGVhZC4uLlxuICAgIHRoaXMuY29uZmlnUHJvcHMkID0gdGhpcy5wQ29ubiQucmVzb2x2ZUNvbmZpZ1Byb3BzKHRoaXMucENvbm4kLmdldENvbmZpZ1Byb3BzKCkpIGFzIFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG5cbiAgICBpZiAodGhpcy5jb25maWdQcm9wcyQudmlzaWJpbGl0eSAhPSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICB0aGlzLmJWaXNpYmxlJCA9IHRoaXMuYlZpc2libGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQudmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogZ2V0Q29uZmlnUHJvcHMoKSBoYXMgZWFjaCBjaGlsZC5jb25maWcgd2l0aCBkYXRhc291cmNlIGFuZCB2YWx1ZSB1bmRlZmluZWRcbiAgICAvLyAgYnV0IGdldFJhd01ldGFkYXRhKCkgaGFzIGVhY2ggY2hpbGQuY29uZmlnIHdpdGggZGF0YXNvdXJjZSBhbmQgdmFsdWUgc2hvd2luZyB0aGVpciB1bnJlc29sdmVkIHZhbHVlcyAoZXg6IFwiQFAgdGhlUHJvcE5hbWVcIilcbiAgICAvLyAgV2UgbmVlZCB0byB1c2UgdGhlIHByb3AgbmFtZSBhcyB0aGUgXCJnbHVlXCIgdG8gdGllIHRoZSBBbmd1bGFyIE1hdGVyaWFsIHRhYmxlIGRhdGFTb3VyY2UsIGRpc3BsYXlDb2x1bW5zIGFuZCBkYXRhIHRvZ2V0aGVyLlxuICAgIC8vICBTbywgaW4gdGhlIGNvZGUgYmVsb3csIHdlJ2xsIHVzZSB0aGUgdW5yZXNvbHZlZCBjb25maWcudmFsdWUgKGJ1dCByZXBsYWNpbmcgdGhlIHNwYWNlIHdpdGggYW4gdW5kZXJzY29yZSB0byBrZWVwIHRoaW5ncyBoYXBweSlcbiAgICBjb25zdCByYXdNZXRhZGF0YSA9IHRoaXMucENvbm4kLmdldFJhd01ldGFkYXRhKCk7XG5cbiAgICAvLyBBZGFwdGVkIGZyb20gTmVidWxhXG4gICAgY29uc3Qge1xuICAgICAgcmVmZXJlbmNlTGlzdCA9IFtdLCAvLyBpZiByZWZlcmVuY2VMaXN0IG5vdCBpbiBjb25maWdQcm9wcyQsIGRlZmF1bHQgdG8gZW1weSBsaXN0XG4gICAgICByZW5kZXJNb2RlLFxuICAgICAgY2hpbGRyZW4sIC8vIGRlc3RydWN0dXJlIGNoaWxkcmVuIGludG8gYW4gYXJyYXkgdmFyOiBcInJlc29sdmVkRmllbGRzXCJcbiAgICAgIHByZXNldHMsXG4gICAgICBhbGxvd0FjdGlvbnMsXG4gICAgICBhbGxvd1RhYmxlRWRpdCxcbiAgICAgIGFsbG93Um93RGVsZXRlLFxuICAgICAgbGFiZWw6IGxhYmVsUHJvcCxcbiAgICAgIHByb3BlcnR5TGFiZWwsXG4gICAgICBmaWVsZE1ldGFkYXRhLFxuICAgICAgZWRpdE1vZGUsXG4gICAgICBhZGRBbmRFZGl0Um93c1dpdGhpbixcbiAgICAgIHZpZXdGb3JBZGRBbmRFZGl0TW9kYWwsXG4gICAgICBlZGl0TW9kZUNvbmZpZyxcbiAgICAgIGRpc3BsYXlNb2RlLFxuICAgICAgdXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCxcbiAgICAgIHZpZXdGb3JFZGl0TW9kYWwsXG4gICAgICB0YXJnZXRDbGFzc0xhYmVsXG4gICAgfSA9IHRoaXMuY29uZmlnUHJvcHMkO1xuXG4gICAgY29uc3Qgc2ltcGxlVGFibGVNYW51YWxQcm9wczogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY2hlY2tJZkFsbG93QWN0aW9uc09yUm93RWRpdGluZ0V4aXN0KGFsbG93QWN0aW9ucykgJiYgZWRpdE1vZGUpIHtcbiAgICAgIHNpbXBsZVRhYmxlTWFudWFsUHJvcHMuaGlkZUFkZFJvdyA9IGFsbG93QWN0aW9ucz8uYWxsb3dBZGQgPT09IGZhbHNlO1xuICAgICAgc2ltcGxlVGFibGVNYW51YWxQcm9wcy5oaWRlRGVsZXRlUm93ID0gYWxsb3dBY3Rpb25zPy5hbGxvd0RlbGV0ZSA9PT0gZmFsc2U7XG4gICAgICBzaW1wbGVUYWJsZU1hbnVhbFByb3BzLmhpZGVFZGl0Um93ID0gYWxsb3dBY3Rpb25zPy5hbGxvd0VkaXQgPT09IGZhbHNlO1xuICAgICAgc2ltcGxlVGFibGVNYW51YWxQcm9wcy5kaXNhYmxlRHJhZ0Ryb3AgPSBhbGxvd0FjdGlvbnM/LmFsbG93RHJhZ0Ryb3AgPT09IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoYWxsb3dUYWJsZUVkaXQgPT09IGZhbHNlKSB7XG4gICAgICBzaW1wbGVUYWJsZU1hbnVhbFByb3BzLmhpZGVBZGRSb3cgPSB0cnVlO1xuICAgICAgc2ltcGxlVGFibGVNYW51YWxQcm9wcy5oaWRlRGVsZXRlUm93ID0gdHJ1ZTtcbiAgICAgIHNpbXBsZVRhYmxlTWFudWFsUHJvcHMuZGlzYWJsZURyYWdEcm9wID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZmVyZW5jZUxpc3RTdHIgPSBnZXRDb250ZXh0KHRoaXMucENvbm4kKS5yZWZlcmVuY2VMaXN0U3RyO1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbFByb3AgfHwgcHJvcGVydHlMYWJlbDtcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSBmaWVsZE1ldGFkYXRhPy5kYXRhc291cmNlPy5wYXJhbWV0ZXJzO1xuICAgIHRoaXMudGFyZ2V0Q2xhc3NMYWJlbCA9IHRhcmdldENsYXNzTGFiZWw7XG4gICAgbGV0IHsgY29udGV4dENsYXNzIH0gPSB0aGlzLmNvbmZpZ1Byb3BzJDtcbiAgICB0aGlzLnJlZmVyZW5jZUxpc3QgPSByZWZlcmVuY2VMaXN0O1xuICAgIGlmICghY29udGV4dENsYXNzKSB7XG4gICAgICBsZXQgbGlzdE5hbWUgPSB0aGlzLnBDb25uJC5nZXRDb21wb25lbnRDb25maWcoKS5yZWZlcmVuY2VMaXN0O1xuICAgICAgbGlzdE5hbWUgPSBQQ29yZS5nZXRBbm5vdGF0aW9uVXRpbHMoKS5nZXRQcm9wZXJ0eU5hbWUobGlzdE5hbWUpO1xuICAgICAgY29udGV4dENsYXNzID0gdGhpcy5wQ29ubiQuZ2V0RmllbGRNZXRhZGF0YShsaXN0TmFtZSk/LnBhZ2VDbGFzcztcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0Q2xhc3MgPSBjb250ZXh0Q2xhc3M7XG5cbiAgICBjb25zdCByZXNvbHZlZEZpZWxkcyA9IGNoaWxkcmVuPy5bMF0/LmNoaWxkcmVuIHx8IHByZXNldHM/LlswXS5jaGlsZHJlbj8uWzBdLmNoaWxkcmVuO1xuICAgIC8vIGdldCByYXcgY29uZmlnIGFzIEBQIGFuZCBvdGhlciBhbm5vdGF0aW9ucyBhcmUgcHJvY2Vzc2VkIGFuZCBkb24ndCBhcHBlYXIgaW4gdGhlIHJlc29sdmVkIGNvbmZpZy5cbiAgICAvLyAgRGVzdHJ1Y3R1cmUgXCJyYXdcIiBjaGlsZHJlbiBpbnRvIGFycmF5IHZhcjogXCJyYXdGaWVsZHNcIlxuICAgIC8vICBOT1RFOiB3aGVuIGNvbmZpZy5saXN0VHlwZSA9PSBcImFzc29jaWF0ZWRcIiwgdGhlIHByb3BlcnR5IGNhbiBiZSBmb3VuZCBpbiBlaXRoZXJcbiAgICAvLyAgICBjb25maWcudmFsdWUgKGV4OiBcIkBQIC5EZWNsYXJhbnRDaG9pY2VcIikgb3JcbiAgICAvLyAgICBjb25maWcuZGF0YXNvdXJjZSAoZXg6IFwiQEFTU09DSUFURUQgLkRlY2xhcmFudENob2ljZVwiKVxuICAgIC8vICBOZWl0aGVyIG9mIHRoZXNlIGFwcGVhciBpbiB0aGUgcmVzb2x2ZWQgKHRoaXMuY29uZmlnUHJvcHMkKVxuICAgIGNvbnN0IHJhd0NvbmZpZzogYW55ID0gcmF3TWV0YWRhdGE/LmNvbmZpZztcbiAgICBjb25zdCByYXdGaWVsZHMgPSByYXdDb25maWc/LmNoaWxkcmVuPy5bMF0/LmNoaWxkcmVuIHx8IHJhd0NvbmZpZz8ucHJlc2V0cz8uWzBdLmNoaWxkcmVuPy5bMF0/LmNoaWxkcmVuO1xuICAgIHRoaXMucmF3RmllbGRzID0gcmF3RmllbGRzO1xuICAgIC8vIEF0IHRoaXMgcG9pbnQsIGZpZWxkcyBoYXMgcmVzb2x2ZWRGaWVsZHMgYW5kIHJhd0ZpZWxkcyB3ZSBjYW4gdXNlXG5cbiAgICAvLyBzdGFydCBvZiBmcm9tIE5lYnVsYVxuICAgIC8vIGdldCBjb250ZXh0IG5hbWUgYW5kIHJlZmVyZW5jZUxpc3Qgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHByZXBhcmUgY29uZmlnIG9mIFBDb25uZWN0XG4gICAgLy8gY29uc3QgeyBjb250ZXh0TmFtZSwgcmVmZXJlbmNlTGlzdFN0ciwgcGFnZVJlZmVyZW5jZUZvclJvd3MgfSA9IGdldENvbnRleHQodGhpcy5wQ29ubiQpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRMaXN0ID0gZ2V0UmVmZXJlbmNlTGlzdCh0aGlzLnBDb25uJCk7XG4gICAgdGhpcy5wYWdlUmVmZXJlbmNlID0gYCR7dGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpfSR7cmVzb2x2ZWRMaXN0fWA7XG4gICAgdGhpcy5wQ29ubiQuc2V0UmVmZXJlbmNlTGlzdChyZXNvbHZlZExpc3QpO1xuXG4gICAgLy8gVGhpcyBnaXZlcyB1cCB0aGUgXCJwcm9wZXJ0aWVzXCIgd2UgbmVlZCB0byBtYXAgdG8gcm93L2NvbHVtbiB2YWx1ZXMgbGF0ZXJcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREYXRhID0gcG9wdWxhdGVSb3dLZXkocmVmZXJlbmNlTGlzdCk7XG5cbiAgICB0aGlzLnJlcXVlc3RlZFJlYWRPbmx5TW9kZSA9IHJlbmRlck1vZGUgPT09ICdSZWFkT25seSc7XG4gICAgdGhpcy5yZWFkT25seU1vZGUgPSByZW5kZXJNb2RlID09PSAnUmVhZE9ubHknO1xuICAgIHRoaXMuZWRpdGFibGVNb2RlID0gcmVuZGVyTW9kZSA9PT0gJ0VkaXRhYmxlJztcbiAgICBjb25zdCBpc0Rpc3BsYXlNb2RlRW5hYmxlZCA9IGRpc3BsYXlNb2RlID09PSAnRElTUExBWV9PTkxZJztcbiAgICB0aGlzLnNob3dBZGRSb3dCdXR0b24gPSAhdGhpcy5yZWFkT25seU1vZGUgJiYgIXNpbXBsZVRhYmxlTWFudWFsUHJvcHMuaGlkZUFkZFJvdztcbiAgICB0aGlzLmFsbG93RWRpdGluZ0luTW9kYWwgPVxuICAgICAgKGVkaXRNb2RlID8gZWRpdE1vZGUgPT09ICdtb2RhbCcgOiBhZGRBbmRFZGl0Um93c1dpdGhpbiA9PT0gJ21vZGFsJykgJiYgIShyZW5kZXJNb2RlID09PSAnUmVhZE9ubHknIHx8IGlzRGlzcGxheU1vZGVFbmFibGVkKTtcbiAgICBjb25zdCBzaG93RGVsZXRlQnV0dG9uID0gdGhpcy5lZGl0YWJsZU1vZGUgJiYgIXNpbXBsZVRhYmxlTWFudWFsUHJvcHMuaGlkZURlbGV0ZVJvdyAmJiBldmFsdWF0ZUFsbG93Um93QWN0aW9uKGFsbG93Um93RGVsZXRlLCB0aGlzLnJvd0RhdGEpO1xuICAgIHRoaXMuZGVmYXVsdFZpZXcgPSBlZGl0TW9kZUNvbmZpZyA/IGVkaXRNb2RlQ29uZmlnLmRlZmF1bHRWaWV3IDogdmlld0ZvckFkZEFuZEVkaXRNb2RhbDtcbiAgICB0aGlzLmJVc2VTZXBhcmF0ZVZpZXdGb3JFZGl0ID0gZWRpdE1vZGVDb25maWcgPyBlZGl0TW9kZUNvbmZpZy51c2VTZXBhcmF0ZVZpZXdGb3JFZGl0IDogdXNlU2VwYXJhdGVWaWV3Rm9yRWRpdDtcbiAgICB0aGlzLmVkaXRWaWV3ID0gZWRpdE1vZGVDb25maWcgPyBlZGl0TW9kZUNvbmZpZy5lZGl0VmlldyA6IHZpZXdGb3JFZGl0TW9kYWw7XG4gICAgLy8gY29uc3Qgc2hvd0RlbGV0ZUJ1dHRvbiA9ICF0aGlzLnJlYWRPbmx5TW9kZSAmJiAhaGlkZURlbGV0ZVJvdztcblxuICAgIC8vIE5lYnVsYSBoYXMgb3RoZXIgaGFuZGxpbmcgZm9yIGlzUmVhZE9ubHlNb2RlIGJ1dCBoYXMgQ29zbW9zLXNwZWNpZmljIGNvZGVcbiAgICAvLyAgc28gaWdub3JpbmcgdGhhdCBmb3Igbm93Li4uXG4gICAgLy8gZmllbGREZWZzIHdpbGwgYmUgYW4gYXJyYXkgd2hlcmUgZWFjaCBlbnRyeSB3aWxsIGhhdmUgYSBcIm5hbWVcIiB3aGljaCB3aWxsIGJlIHRoZVxuICAgIC8vICBcInJlc29sdmVkXCIgcHJvcGVydHkgbmFtZSAodGhhdCB3ZSBjYW4gdXNlIGFzIHRoZSBjb2xJZCkgdGhvdWdoIGl0J3Mgbm90IHJlYWxseVxuICAgIC8vICByZXNvbHZlZC4gVGhlIGJ1aWxkRmllbGRzRm9yVGFibGUgaGVscGVyIGp1c3QgcmVtb3ZlcyB0aGUgXCJAUCBcIiAod2hpY2ggaXMgd2hhdFxuICAgIC8vICBOZWJ1bGEgZG9lcykuIEl0IHdpbGwgYWxzbyBoYXZlIHRoZSBcImxhYmVsXCIsIGFuZCBcIm1ldGFcIiBjb250YWlucyB0aGUgb3JpZ2luYWwsXG4gICAgLy8gIHVuY2hhbmdlZCBjb25maWcgaW5mby4gRm9yIG5vdywgbXVjaCBvZiB0aGUgaW5mbyBoZXJlIGlzIGNhcnJpZWQgb3ZlciBmcm9tXG4gICAgLy8gIE5lYnVsYSBhbmQgd2UgbWF5IG5vdCBlbmQgdXAgdXNpbmcgaXQgYWxsLlxuICAgIHRoaXMuZmllbGREZWZzID0gYnVpbGRGaWVsZHNGb3JUYWJsZShyYXdGaWVsZHMsIHJlc29sdmVkRmllbGRzLCBzaG93RGVsZXRlQnV0dG9uKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZURlZmF1bHRQYWdlSW5zdHJ1Y3Rpb25zKCk7XG5cbiAgICAvLyBlbmQgb2YgZnJvbSBOZWJ1bGFcblxuICAgIC8vIEhlcmUsIHdlIHVzZSB0aGUgXCJuYW1lXCIgZmllbGQgaW4gZmllbGREZWZzIHNpbmNlIHRoYXQgaGFzIHRoZSBhc3NvaWNhdGVkIHByb3BlcnR5XG4gICAgLy8gIChpZiBvbmUgZXhpc3RzIGZvciB0aGUgZmllbGQpLiBJZiBubyBcIm5hbWVcIiwgdXNlIFwiY2VsbFJlbmRlcmVyXCIgKHR5cGljYWxseSBnZXQgREVMRVRFX0lDT04pXG4gICAgLy8gIGZvciBvdXIgY29sdW1ucy5cbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmZpZWxkRGVmcz8ubWFwKGZpZWxkID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5uYW1lID8gZmllbGQubmFtZSA6IGZpZWxkLmNlbGxSZW5kZXJlcjtcbiAgICB9KTtcblxuICAgIC8vIEFuZCBub3cgd2UgY2FuIHByb2Nlc3MgdGhlIHJlc29sdmVkRmllbGRzIHRvIGFkZCBpbiB0aGUgXCJuYW1lXCJcbiAgICAvLyAgZnJvbSBmcm9tIHRoZSBmaWVsZERlZnMuIFRoaXMgXCJuYW1lXCIgaXMgdGhlIHZhbHVlIHRoYXRcbiAgICAvLyAgd2UnbGwgc2hhcmUgdG8gY29ubmVjdCB0aGluZ3MgdG9nZXRoZXIgaW4gdGhlIHRhYmxlLlxuXG4gICAgdGhpcy5wcm9jZXNzZWRGaWVsZHMgPSBbXTtcblxuICAgIHRoaXMucHJvY2Vzc2VkRmllbGRzID0gcmVzb2x2ZWRGaWVsZHMubWFwKChmaWVsZCwgaSkgPT4ge1xuICAgICAgZmllbGQuY29uZmlnLm5hbWUgPSB0aGlzLmRpc3BsYXllZENvbHVtbnNbaV07IC8vIC5jb25maWdbXCJ2YWx1ZVwiXS5yZXBsYWNlKC8gLi9nLFwiX1wiKTsgICAvLyByZXBsYWNlIHNwYWNlIGRvdCB3aXRoIHVuZGVyc2NvcmVcbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9KTtcblxuICAgIC8vIGZvciBhZGRpbmcgcm93cyB0byB0YWJsZSB3aGVuIGVkaXRhYmxlIGFuZCBub3QgbW9kYWwgdmlld1xuICAgIGlmICh0aGlzLnByZXZSZWZlcmVuY2VMaXN0Lmxlbmd0aCAhPT0gdGhpcy5yZWZlcmVuY2VMaXN0Lmxlbmd0aCkge1xuICAgICAgdGhpcy5idWlsZEVsZW1lbnRzRm9yVGFibGUoKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgZWRpdCBhbmQgYWRkaW5nIHJvd3MgaW4gbW9kYWwgdmlldyBhbmQgdG8gZ2VuZXJhdGUgcmVhZG9ubHkgbGlzdFxuICAgIGlmICghaXNFcXVhbCh0aGlzLnByZXZSZWZlcmVuY2VMaXN0LCB0aGlzLnJlZmVyZW5jZUxpc3QpICYmICh0aGlzLnJlYWRPbmx5TW9kZSB8fCB0aGlzLmFsbG93RWRpdGluZ0luTW9kYWwpKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlUm93c0RhdGEoKTtcbiAgICB9XG5cbiAgICB0aGlzLnByZXZSZWZlcmVuY2VMaXN0ID0gdGhpcy5yZWZlcmVuY2VMaXN0O1xuXG4gICAgLy8gVGhlc2UgYXJlIHRoZSBkYXRhIHN0cnVjdHVyZXMgcmVmZXJyZWQgdG8gaW4gdGhlIGh0bWwgZmlsZS5cbiAgICAvLyAgVGhlc2UgYXJlIHRoZSByZWxhdGlvbnNoaXBzIHRoYXQgbWFrZSB0aGUgdGFibGUgd29ya1xuICAgIC8vICBkaXNwbGF5ZWRDb2x1bW5zOiBrZXkvdmFsdWUgcGFpcnMgd2hlcmUga2V5IGlzIG9yZGVyIG9mIGNvbHVtbiBhbmRcbiAgICAvLyAgICB2YWx1ZSBpcyB0aGUgcHJvcGVydHkgc2hvd24gaW4gdGhhdCBjb2x1bW4uIEV4OiAxOiBcIkZpcnN0TmFtZVwiXG4gICAgLy8gIHByb2Nlc3NlZEZpZWxkczoga2V5L3ZhbHVlIHBhaXJzIHdoZXJlIGVhY2gga2V5IGlzIG9yZGVyIG9mIGNvbHVtblxuICAgIC8vICAgIGFuZCBlYWNoIHZhbHVlIGlzIGFuIG9iamVjdCBvZiBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoYXRcbiAgICAvLyAgICBjb2x1bW4uXG4gICAgLy8gIHJvd0RhdGE6IGFycmF5IG9mIGVhY2ggcm93J3Mga2V5L3ZhbHVlIHBhaXJzLiBJbnNpZGUgZWFjaCByb3csXG4gICAgLy8gICAgZWFjaCBrZXkgaXMgYW4gZW50cnkgaW4gZGlzcGxheWVkQ29sdW1uczogZXg6IFwiRmlyc3ROYW1lXCI6IFwiQ2hhcmxlc1wiXG4gICAgLy8gICAgRXg6IHsgMToge2NvbmZpZzoge2xhYmVsOiBcIkZpcnN0IE5hbWVcIiwgcmVhZE9ubHk6IHRydWU6IG5hbWU6IFwiRmlyc3ROYW1lXCJ9fSwgdHlwZTogXCJUZXh0SW5wdXRcIiB9XG4gICAgLy8gICAgVGhlIFwidHlwZVwiIGluZGljYXRlcyB0aGUgdHlwZSBvZiBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgZWRpdGluZyAod2hlbiBlZGl0aW5nIGlzIGVuYWJsZWQpXG4gICAgLy9cbiAgICAvLyAgTm90ZSB0aGF0IHRoZSBcInByb3BlcnR5XCIgc2hvd24gaW4gdGhlIGNvbHVtbiAoXCJGaXJzdE5hbWVcIiBpbiB0aGUgYWJvdmUgZXhhbXBsZXMpIGlzIHdoYXRcbiAgICAvLyAgdGllcyB0aGUgMyBkYXRhIHN0cnVjdHVyZXMgdG9nZXRoZXIuXG4gIH1cblxuICBjaGVja0lmQWxsb3dBY3Rpb25zT3JSb3dFZGl0aW5nRXhpc3QobmV3ZmxhZ29iamVjdCkge1xuICAgIHJldHVybiAobmV3ZmxhZ29iamVjdCAmJiBPYmplY3Qua2V5cyhuZXdmbGFnb2JqZWN0KS5sZW5ndGggPiAwKSB8fCB0aGlzLnBDb25uJC5nZXRDb21wb25lbnRDb25maWcoKS5hbGxvd1Jvd0VkaXQ7XG4gIH1cblxuICBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbnN0cnVjdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmdJbk1vZGFsKSB7XG4gICAgICAgIHRoaXMucENvbm4kLmdldExpc3RBY3Rpb25zKCkuaW5pdERlZmF1bHRQYWdlSW5zdHJ1Y3Rpb25zKFxuICAgICAgICAgIHRoaXMucENvbm4kLmdldFJlZmVyZW5jZUxpc3QoKSxcbiAgICAgICAgICB0aGlzLmZpZWxkRGVmcy5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUpLm1hcChpdGVtID0+IGl0ZW0ubmFtZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgLSBBbiBhcmd1bWVudCBmb3IgJ3Byb3BlcnR5TmFtZXMnIHdhcyBub3QgcHJvdmlkZWQuXG4gICAgICAgIHRoaXMucENvbm4kLmdldExpc3RBY3Rpb25zKCkuaW5pdERlZmF1bHRQYWdlSW5zdHJ1Y3Rpb25zKHRoaXMucENvbm4kLmdldFJlZmVyZW5jZUxpc3QoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVzdWx0c1RleHQoKSB7XG4gICAgY29uc3QgcmVjb3Jkc0NvdW50ID0gdGhpcy5yZWFkT25seU1vZGUgPyB0aGlzLnJvd0RhdGE/LmRhdGEubGVuZ3RoIDogdGhpcy5yZWZlcmVuY2VMaXN0Py5sZW5ndGg7XG4gICAgcmV0dXJuIGAke3JlY29yZHNDb3VudCB8fCAwfSByZXN1bHQke3JlY29yZHNDb3VudCA+IDEgPyAncycgOiAnJ31gO1xuICB9XG5cbiAgc29ydENvbXBhcmUoYSwgYik6IG51bWJlciB7XG4gICAgbGV0IGFWYWx1ZSA9IGFbMF1bdGhpcy5jb21wYXJlUmVmXTtcbiAgICBsZXQgYlZhbHVlID0gYlswXVt0aGlzLmNvbXBhcmVSZWZdO1xuXG4gICAgaWYgKHRoaXMuY29tcGFyZVR5cGUgPT0gJ0RhdGUnIHx8IHRoaXMuY29tcGFyZVR5cGUgPT0gJ0RhdGVUaW1lJykge1xuICAgICAgYVZhbHVlID0gZ2V0U2Vjb25kcyhhVmFsdWUpO1xuICAgICAgYlZhbHVlID0gZ2V0U2Vjb25kcyhiVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBhcmVSZWYgPT0gJ3B4UmVmT2JqZWN0SW5zTmFtZScpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29tcGFyZUJ5Q29sdW1uUHhSZWZPYmplY3RJbnNOYW1lKGFWYWx1ZSwgYlZhbHVlKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgc3dpdGNoICh0aGlzLmFycm93RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICd1cCc6XG4gICAgICAgIGlmICghYVZhbHVlIHx8IGFWYWx1ZSA8IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJWYWx1ZSB8fCBhVmFsdWUgPiBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICBpZiAoIWJWYWx1ZSB8fCBhVmFsdWUgPiBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhVmFsdWUgfHwgYVZhbHVlIDwgYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbXBhcmVCeUNvbHVtblB4UmVmT2JqZWN0SW5zTmFtZShhVmFsdWUsIGJWYWx1ZSkge1xuICAgIGNvbnN0IHByZWZpeFggPSBhVmFsdWUuc3BsaXQoJy0nKTtcbiAgICBjb25zdCBwcmVmaXhZID0gYlZhbHVlLnNwbGl0KCctJyk7XG4gICAgc3dpdGNoICh0aGlzLmFycm93RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICd1cCc6XG4gICAgICAgIGlmIChwcmVmaXhYWzBdICE9PSBwcmVmaXhZWzBdKSB7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPCBwcmVmaXhZWzBdKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPiBwcmVmaXhZWzBdKSByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4WFsxXSAtIHByZWZpeFlbMV07XG4gICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgaWYgKHByZWZpeFhbMF0gIT09IHByZWZpeFlbMF0pIHtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA+IHByZWZpeFlbMF0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA8IHByZWZpeFlbMF0pIHJldHVybiAxO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVmaXhZWzFdIC0gcHJlZml4WFsxXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJEaXNwbGF5KHR5cGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RpbWUnOlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnY29udGFpbnMnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9maWx0ZXIoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBhZGQgY2xpY2tBd2F5IGxpc3RlbmVyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhID0gY29sdW1uRGF0YTtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zTGFiZWwkID0gY29sdW1uRGF0YS5jb25maWcubGFiZWw7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyRGlzcGxheShjb2x1bW5EYXRhLnR5cGUpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlclZhcnNXaXRoQ3VycmVudChjb2x1bW5EYXRhKTtcblxuICAgICAgdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jbGlja0F3YXkoZXZlbnQ6IGFueSkge1xuICAgIGxldCBiSW5Qb3BVcCA9IGZhbHNlO1xuXG4gICAgLy8gcnVuIHRocm91Z2ggbGlzdCBvZiBlbGVtZW50cyBpbiBwYXRoLCBpZiBtZW51IG5vdCBpbiB0aCBwYXRoLCB0aGVuIHdhbnQgdG9cbiAgICAvLyBoaWRlICh0b2dnbGUpIHRoZSBtZW51XG4gICAgY29uc3QgZXZlbnRQYXRoID0gZXZlbnQucGF0aDtcbiAgICBpZiAoZXZlbnRQYXRoKSB7XG4gICAgICBmb3IgKGxldCBldmVudEluZGV4ID0gMDsgZXZlbnRJbmRleCA8IGV2ZW50UGF0aC5sZW5ndGg7IGV2ZW50SW5kZXgrKykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXZlbnRQYXRoW2V2ZW50SW5kZXhdLmNsYXNzTmFtZSA9PSAncHNkay1tb2RhbC1maWxlLXRvcCcgfHxcbiAgICAgICAgICBldmVudFBhdGhbZXZlbnRJbmRleF0udGFnTmFtZSA9PSAnQlVUVE9OJyB8fFxuICAgICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS50YWdOYW1lID09ICdNQVQtT1BUSU9OJyB8fFxuICAgICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS50YWdOYW1lID09ICdNQVQtSU5QVVQnXG4gICAgICAgICkge1xuICAgICAgICAgIGJJblBvcFVwID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYkluUG9wVXApIHtcbiAgICAgIC8vIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNUeXBlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gZXZlbnQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNEYXRlVmFsdWUoZXZlbnQsIHZhbHVlKSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IHZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zRGF0ZVRpbWVWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNUaW1lVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX29uRmlsdGVyQWN0aW9uQnV0dG9uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIC8vIG1vZGFsIGJ1dHRvbnNcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YSA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyV2l0aEluZm8oKTtcbiAgICAgICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJXaXRoSW5mbygpIHtcbiAgICBsZXQgYkZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmoucmVmID09PSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIGZpbHRlck9iai50eXBlID0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS50eXBlO1xuICAgICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPSB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQ7XG4gICAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJDtcblxuICAgICAgICBiRm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWJGb3VuZCkge1xuICAgICAgLy8gYWRkIGluXG4gICAgICBjb25zdCBmaWx0ZXJPYmo6IGFueSA9IHt9O1xuICAgICAgZmlsdGVyT2JqLnJlZiA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEuY29uZmlnLm5hbWU7XG4gICAgICBmaWx0ZXJPYmoudHlwZSA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEudHlwZTtcbiAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9IHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJDtcbiAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJDtcblxuICAgICAgdGhpcy5maWx0ZXJCeUNvbHVtbnMucHVzaChmaWx0ZXJPYmopO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBmaWx0ZXJzIGFuZCB1cGRhdGUgZmlsdGVyT24gaWNvblxuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb250YWluc0ZpbHRlclZhbHVlID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWU7XG4gICAgICBjb25zdCBjb250YWluc0ZpbHRlciA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlclJlZiA9IGZpbHRlck9iai5yZWY7XG4gICAgICBjb25zdCBmaWx0ZXJJbmRleCA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKGZpbHRlclJlZik7XG4gICAgICBjb25zdCBhckZpbHRlckltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdmaWx0ZXJPbkljb24nKTtcbiAgICAgIGNvbnN0IGZpbHRlckltZzogYW55ID0gYXJGaWx0ZXJJbWdbZmlsdGVySW5kZXhdO1xuICAgICAgaWYgKGNvbnRhaW5zRmlsdGVyVmFsdWUgPT0gJycgJiYgY29udGFpbnNGaWx0ZXIgIT0gJ251bGwnICYmIGNvbnRhaW5zRmlsdGVyICE9ICdub3RudWxsJykge1xuICAgICAgICAvLyBjbGVhciBpY29uXG4gICAgICAgIGZpbHRlckltZy5zcmMgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNob3cgaWNvblxuICAgICAgICBmaWx0ZXJJbWcuc3JjID0gdGhpcy5maWx0ZXJPblN2Z0ljb24kO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUZpbHRlclZhcnNXaXRoQ3VycmVudChjb2x1bW5EYXRhKSB7XG4gICAgLy8gZmluZCBjdXJyZW50IHJlZiwgaWYgZXhpc3RzLCBtb3ZlIGRhdGEgdG8gdmFyaWFibGUgdG8gZGlzcGxheVxuXG4gICAgbGV0IGJGb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLnJlZiA9PT0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXI7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZTtcblxuICAgICAgICBiRm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWJGb3VuZCkge1xuICAgICAgc3dpdGNoIChjb2x1bW5EYXRhLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnY29udGFpbnMnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyRGF0YShlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBpdGVtID0gZWxlbWVudFswXTtcbiAgICBsZXQgYktlZXAgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgIT0gJycgfHwgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID09ICdudWxsJyB8fCBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPT0gJ25vdG51bGwnKSB7XG4gICAgICAgIHN3aXRjaCAoZmlsdGVyT2JqLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgICAgICBiS2VlcCA9IGZpbHRlckRhdGFCeURhdGUoaXRlbSwgZmlsdGVyT2JqKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBiS2VlcCA9IGZpbHRlckRhdGFCeUNvbW1vbkZpZWxkcyhpdGVtLCBmaWx0ZXJPYmopO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgPT09ICcnKSB7XG4gICAgICAgIGJLZWVwID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgZG9uJ3Qga2VlcCBzdG9wIGZpbHRlcmluZ1xuICAgICAgaWYgKCFiS2VlcCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYktlZXA7XG4gIH1cblxuICBmaWx0ZXJTb3J0R3JvdXBCeSgpIHtcbiAgICBsZXQgdGhlRGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLnNsaWNlKCkubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIFtpdGVtLCBpbmRleF07XG4gICAgfSk7XG5cbiAgICAvLyBsYXN0IGZpbHRlciBjb25maWcgZGF0YSBpcyBnbG9iYWxcbiAgICB0aGVEYXRhID0gdGhlRGF0YS5maWx0ZXIodGhpcy5maWx0ZXJEYXRhLmJpbmQodGhpcykpO1xuXG4gICAgLy8gbGFzdCBzb3J0IGNvbmZpZyBkYXRhIGlzIGdsb2JhbFxuICAgIHRoZURhdGEuc29ydCh0aGlzLnNvcnRDb21wYXJlLmJpbmQodGhpcykpO1xuICAgIHRoaXMucm93RGF0YS5kYXRhID0gdGhlRGF0YS5tYXAoaXRlbSA9PiBpdGVtWzBdKTtcblxuICAgIGNvbnN0IG5ld0VsZW1lbnRzOiBhbnkgPSBuZXcgQXJyYXkodGhpcy5yb3dEYXRhLmRhdGEubGVuZ3RoKTtcbiAgICB0aGVEYXRhLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBuZXdFbGVtZW50c1tpbmRleF0gPSB0aGlzLm9yaWdpbmFsRWxlbWVudHNEYXRhW2l0ZW1bMV1dO1xuICAgIH0pO1xuICAgIHRoaXMuZWxlbWVudHNEYXRhID0gbmV3RWxlbWVudHM7XG4gIH1cblxuICBfaGVhZGVyU29ydENsaWNrKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gaW1hZ2VzIDAgLSBmaWx0ZXIsIDEgLSBhcnJvdywgMiAtIG1vcmVcblxuICAgIC8qKiBDb21tZW50aW5nIHRoaXMgY29kZSBmb3Igbm93IGFzIGl0IGlzIGdpdmluZyBlcnJvcnMgbm90IHN1cmUgaWYgaXQgZXZlciB3b3JrZWQgKi9cbiAgICAvLyBsZXQgYXJyb3dJbWFnZSA9IGV2ZW50LnNyY0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpWzFdO1xuICAgIC8vIGxldCBhcnJvd0F0dHIgPSBhcnJvd0ltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3cnKTtcblxuICAgIC8vIHRoaXMuY2xlYXJPdXRBcnJvd3MoZXZlbnQsIGNvbHVtbkRhdGEpO1xuXG4gICAgLy8gc3dpdGNoIChhcnJvd0F0dHIpIHtcbiAgICAvLyAgIGNhc2UgJ3VwJzpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSB0aGlzLmFycm93RG93blN2Z0ljb24kO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnZG93bicpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyAgIGNhc2UgJ2Rvd24nOlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9ICcnO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnbm9uZScpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyAgIGRlZmF1bHQ6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gdGhpcy5hcnJvd1VwU3ZnSWNvbiQ7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICd1cCcpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyB9XG5cbiAgICB0aGlzLmNvbXBhcmVUeXBlID0gY29sdW1uRGF0YS50eXBlO1xuICAgIHRoaXMuY29tcGFyZVJlZiA9IGNvbHVtbkRhdGEuY29uZmlnLm5hbWU7XG4gICAgLy8gdGhpcy5hcnJvd0RpcmVjdGlvbiA9IGFycm93SW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvdycpO1xuICAgIHRoaXMuYXJyb3dEaXJlY3Rpb24gPSB0aGlzLmFycm93RGlyZWN0aW9uID09PSAndXAnID8gJ2Rvd24nIDogJ3VwJztcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIF9zaG93VW5Hcm91cEJ5KGNvbHVtbkRhdGEpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLmdyb3VwQnlDb2x1bW5zJCkge1xuICAgICAgaWYgKHZhbCA9PSBjb2x1bW5EYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIF9ncm91cEJ5KGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uRGF0YS5jb25maWcubmFtZSwgdHJ1ZSk7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICBfdW5Hcm91cEJ5KGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uRGF0YS5jb25maWcubmFtZSwgZmFsc2UpO1xuXG4gICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICB9XG5cbiAgY2hlY2tHcm91cEJ5Q29sdW1uKGZpZWxkLCBhZGQpIHtcbiAgICBsZXQgZm91bmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKSB7XG4gICAgICBpZiAoY29sdW1uID09PSBmaWVsZCkge1xuICAgICAgICBmb3VuZCA9IHRoaXMuZ3JvdXBCeUNvbHVtbnMkLmluZGV4T2YoY29sdW1uLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZvdW5kICE9IG51bGwgJiYgZm91bmQgPj0gMCkge1xuICAgICAgaWYgKCFhZGQpIHtcbiAgICAgICAgdGhpcy5ncm91cEJ5Q29sdW1ucyQuc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFkZCkge1xuICAgICAgdGhpcy5ncm91cEJ5Q29sdW1ucyQucHVzaChmaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgX2dldEdyb3VwTmFtZShmaWVsZE5hbWUpIHtcbiAgICBmb3IgKGxldCBmaWVsZEluZGV4ID0gMDsgZmllbGRJbmRleCA8IHRoaXMuZmllbGRzJC5sZW5ndGg7IGZpZWxkSW5kZXgrKykge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcyRbZmllbGRJbmRleF07XG4gICAgICBpZiAoZmllbGQuY29uZmlnLm5hbWUgPT0gZmllbGROYW1lKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5jb25maWcubGFiZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGFkZEdyb3VwcyhkYXRhOiBhbnlbXSwgZ3JvdXBCeUNvbHVtbnM6IHN0cmluZ1tdKTogYW55W10ge1xuICAgIGNvbnN0IHJvb3RHcm91cCA9IG5ldyBHcm91cCgpO1xuICAgIHJvb3RHcm91cC5leHBhbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VibGV2ZWwoZGF0YSwgMCwgZ3JvdXBCeUNvbHVtbnMsIHJvb3RHcm91cCk7XG4gIH1cblxuICBnZXRTdWJsZXZlbChkYXRhOiBhbnlbXSwgbGV2ZWw6IG51bWJlciwgZ3JvdXBCeUNvbHVtbnM6IHN0cmluZ1tdLCBwYXJlbnQ6IEdyb3VwKTogYW55W10ge1xuICAgIGlmIChsZXZlbCA+PSBncm91cEJ5Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBjb25zdCBncm91cHMgPSB0aGlzLnVuaXF1ZUJ5KFxuICAgICAgZGF0YS5tYXAocm93ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEdyb3VwKCk7XG4gICAgICAgIHJlc3VsdC5sZXZlbCA9IGxldmVsICsgMTtcbiAgICAgICAgcmVzdWx0LnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGV2ZWw7IGkrKykge1xuICAgICAgICAgIHJlc3VsdFtncm91cEJ5Q29sdW1uc1tpXV0gPSByb3dbZ3JvdXBCeUNvbHVtbnNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSxcbiAgICAgIEpTT04uc3RyaW5naWZ5XG4gICAgKTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSBncm91cEJ5Q29sdW1uc1tsZXZlbF07XG4gICAgbGV0IHN1Ykdyb3VwczogYW55ID0gW107XG4gICAgZ3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgY29uc3Qgcm93c0luR3JvdXAgPSBkYXRhLmZpbHRlcihyb3cgPT4gZ3JvdXBbY3VycmVudENvbHVtbl0gPT09IHJvd1tjdXJyZW50Q29sdW1uXSk7XG4gICAgICBncm91cC50b3RhbENvdW50cyA9IHJvd3NJbkdyb3VwLmxlbmd0aDtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gdGhpcy5nZXRTdWJsZXZlbChyb3dzSW5Hcm91cCwgbGV2ZWwgKyAxLCBncm91cEJ5Q29sdW1ucywgZ3JvdXApO1xuICAgICAgc3ViR3JvdXAudW5zaGlmdChncm91cCk7XG4gICAgICBzdWJHcm91cHMgPSBzdWJHcm91cHMuY29uY2F0KHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3ViR3JvdXBzO1xuICB9XG5cbiAgdW5pcXVlQnkoYSwga2V5KSB7XG4gICAgY29uc3Qgc2VlbiA9IHt9O1xuICAgIHJldHVybiBhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGsgPSBrZXkoaXRlbSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmV0dXJuLWFzc2lnbiwgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICByZXR1cm4gc2Vlbi5oYXNPd25Qcm9wZXJ0eShrKSA/IGZhbHNlIDogKHNlZW5ba10gPSB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzR3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS5sZXZlbDtcbiAgfVxuXG4gIF9ncm91cEhlYWRlckNsaWNrKHJvdykge1xuICAgIHJvdy5leHBhbmRlZCA9ICFyb3cuZXhwYW5kZWQ7XG4gICAgLy8gdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSBcIlwiO1xuICAgIHRoaXMucGVyZkZpbHRlciA9IHBlcmZvcm1hbmNlLm5vdygpLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5yb3dEYXRhLmZpbHRlciA9IHRoaXMucGVyZkZpbHRlcjtcbiAgfVxuXG4gIC8vIGJlbG93IGlzIGZvciBncmlkIHJvdyBncm91cGluZ1xuICBjdXN0b21GaWx0ZXJQcmVkaWNhdGUoZGF0YTogYW55IHwgR3JvdXAsIGZpbHRlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRhdGEgaW5zdGFuY2VvZiBHcm91cCA/IGRhdGEudmlzaWJsZSA6IHRoaXMuZ2V0RGF0YVJvd1Zpc2libGVXaXRoRmlsdGVyKGRhdGEsIGZpbHRlcik7XG4gIH1cblxuICBnZXREYXRhUm93VmlzaWJsZShkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBncm91cFJvd3MgPSB0aGlzLnJvd0RhdGEuZGF0YS5maWx0ZXIocm93ID0+IHtcbiAgICAgIGlmICghKHJvdyBpbnN0YW5jZW9mIEdyb3VwKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBsZXQgbWF0Y2ggPSB0cnVlO1xuICAgICAgdGhpcy5ncm91cEJ5Q29sdW1ucyQuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICBpZiAoIXJvd1tjb2x1bW5dIHx8ICFkYXRhW2NvbHVtbl0gfHwgcm93W2NvbHVtbl0gIT09IGRhdGFbY29sdW1uXSkge1xuICAgICAgICAgIG1hdGNoID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgaWYgKGdyb3VwUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBncm91cFJvd3NbMF0gYXMgR3JvdXA7XG4gICAgcmV0dXJuIHBhcmVudC52aXNpYmxlICYmIHBhcmVudC5leHBhbmRlZDtcbiAgfVxuXG4gIGdldERhdGFSb3dWaXNpYmxlV2l0aEZpbHRlcihkYXRhLCBmaWx0ZXIpIHtcbiAgICAvLyBmaXN0IGNoZWNrIGlmIHJvdyBpcyB2aXNpYmxlIHdpdGggZ3JvdXBpbmdcbiAgICBsZXQgYlZpc2libGUgPSB0aGlzLmdldERhdGFSb3dWaXNpYmxlKGRhdGEpO1xuXG4gICAgaWYgKGJWaXNpYmxlICYmIGZpbHRlciAmJiBmaWx0ZXIgIT0gJycgJiYgZmlsdGVyICE9IHRoaXMucGVyZkZpbHRlcikge1xuICAgICAgLy8gbm93IGNoZWNrIGlmIHJvdyBpcyBmaWx0ZXJlZC5cblxuICAgICAgLy8gYXNzdW1lIG5vdCB0aGVyZSB1bmxlc3Mgd2UgZmluZCBpdFxuICAgICAgYlZpc2libGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuZGlzcGxheWVkQ29sdW1ucykge1xuICAgICAgICAvLyBmaWx0ZXIgaXMgbG93ZXIgY2FzZVxuICAgICAgICBpZiAoZGF0YVtjb2xdICYmIGRhdGFbY29sXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXIpID49IDApIHtcbiAgICAgICAgICBiVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYlZpc2libGU7XG4gIH1cblxuICBnZXREaXNwbGF5Q29sdW1ucyhmaWVsZHMgPSBbXSkge1xuICAgIHJldHVybiBmaWVsZHMubWFwKChmaWVsZDogYW55KSA9PiB7XG4gICAgICBsZXQgdGhlRmllbGQgPSBmaWVsZC5jb25maWcudmFsdWUuc3Vic3RyaW5nKGZpZWxkLmNvbmZpZy52YWx1ZS5pbmRleE9mKCcgJykgKyAxKTtcbiAgICAgIGlmICh0aGVGaWVsZC5pbmRleE9mKCcuJykgPT0gMCkge1xuICAgICAgICB0aGVGaWVsZCA9IHRoZUZpZWxkLnN1YnN0cmluZygxKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZUZpZWxkO1xuICAgIH0pO1xuICB9XG5cbiAgX2dldEljb25TdHlsZShsZXZlbCk6IHN0cmluZyB7XG4gICAgbGV0IHNSZXR1cm4gPSAnJztcbiAgICBsZXQgbkxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICBuTGV2ZWwtLTtcbiAgICBuTGV2ZWwgKj0gMTU7XG4gICAgc1JldHVybiA9IGBwYWRkaW5nLWxlZnQ6ICR7bkxldmVsfXB4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlYDtcblxuICAgIHJldHVybiBzUmV0dXJuO1xuICB9XG5cbiAgLy8gQ2FsbGJhY2sgcGFzc2VkIHdoZW4gc3Vic2NyaWJpbmcgdG8gc3RvcmUgY2hhbmdlXG4gIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8gcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBzaG93biBhcyB0aGUgY29udGVudHMgZm9yIHRoZSBnaXZlbiByb3cgZGF0YVxuICAvLyAgb2YgdGhlIGdpdmVuIHJvdyBmaWVsZFxuICBnZXRSb3dWYWx1ZShpblJvd0RhdGE6IE9iamVjdCwgaW5Db2xLZXk6IHN0cmluZyk6IGFueSB7XG4gICAgLy8gU2VlIHdoYXQgZGF0YSAoaWYgYW55KSB3ZSBoYXZlIHRvIGRpc3BsYXlcbiAgICBjb25zdCByZWZLZXlzOiBzdHJpbmdbXSA9IGluQ29sS2V5LnNwbGl0KCcuJyk7XG4gICAgbGV0IHZhbEJ1aWxkZXIgPSBpblJvd0RhdGE7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVmS2V5cykge1xuICAgICAgdmFsQnVpbGRlciA9IHZhbEJ1aWxkZXJba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbEJ1aWxkZXI7XG4gIH1cblxuICBnZW5lcmF0ZVJvd3NEYXRhKCkge1xuICAgIGNvbnN0IHsgZGF0YVBhZ2VOYW1lLCByZWZlcmVuY2VMaXN0IH0gPSB0aGlzLmNvbmZpZ1Byb3BzJDtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICAvLyBpZiBkYXRhUGFnZU5hbWUgcHJvcGVydHkgdmFsdWUgZXhpc3RzIHRoZW4gbWFrZSBhIGRhdGFwYWdlIGZldGNoIGNhbGwgYW5kIGdldCB0aGUgbGlzdCBvZiBkYXRhLlxuICAgIGlmIChkYXRhUGFnZU5hbWUpIHtcbiAgICAgIHRoaXMuZGF0YVBhZ2VTZXJ2aWNlLmdldERhdGFQYWdlRGF0YShkYXRhUGFnZU5hbWUsIHRoaXMucGFyYW1ldGVycywgY29udGV4dCkudGhlbihsaXN0RGF0YSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1hdFJvd3NEYXRhKGxpc3REYXRhKTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnJvd0RhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZWZlcmVuY2VMaXN0IHByb3AgaGFzIHRoZSBKU09OIGRhdGEgZm9yIGVhY2ggcm93IHRvIGJlIGRpc3BsYXllZFxuICAgICAgLy8gIGluIHRoZSB0YWJsZS4gU28sIGl0ZXJhdGUgb3ZlciByZWZlcmVuY2VMaXN0IHRvIGNyZWF0ZSB0aGUgZGF0YVJvd3MgdGhhdFxuICAgICAgLy8gIHdlJ3JlIHVzaW5nIGFzIHRoZSB0YWJsZSdzIGRhdGFTb3VyY2VcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1hdFJvd3NEYXRhKHJlZmVyZW5jZUxpc3QpO1xuICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSBkYXRhO1xuICAgICAgdGhpcy5yb3dEYXRhID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRSb3dzRGF0YShkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGE/Lm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnMucmVkdWNlKChkYXRhRm9yUm93LCBjb2xLZXkpID0+IHtcbiAgICAgICAgZGF0YUZvclJvd1tjb2xLZXldID0gdGhpcy5nZXRSb3dWYWx1ZShpdGVtLCBjb2xLZXkpO1xuICAgICAgICByZXR1cm4gZGF0YUZvclJvdztcbiAgICAgIH0sIHt9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFJlY29yZCgpIHtcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmdJbk1vZGFsICYmIHRoaXMuZGVmYXVsdFZpZXcpIHtcbiAgICAgIHRoaXMucENvbm4kXG4gICAgICAgIC5nZXRBY3Rpb25zQXBpKClcbiAgICAgICAgLm9wZW5FbWJlZGRlZERhdGFNb2RhbChcbiAgICAgICAgICB0aGlzLmRlZmF1bHRWaWV3LFxuICAgICAgICAgIHRoaXMucENvbm4kIGFzIGFueSxcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZUxpc3RTdHIsXG4gICAgICAgICAgdGhpcy5yZWZlcmVuY2VMaXN0Lmxlbmd0aCxcbiAgICAgICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5SRVNPVVJDRV9TVEFUVVMuQ1JFQVRFLFxuICAgICAgICAgIHRoaXMudGFyZ2V0Q2xhc3NMYWJlbFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBDb25uJC5nZXRMaXN0QWN0aW9ucygpLmluc2VydCh7IGNsYXNzSUQ6IHRoaXMuY29udGV4dENsYXNzIH0sIHRoaXMucmVmZXJlbmNlTGlzdC5sZW5ndGgpO1xuICAgIH1cblxuICAgIHRoaXMucENvbm4kLmNsZWFyRXJyb3JNZXNzYWdlcyh7XG4gICAgICBwcm9wZXJ0eTogdGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpPy5yZWZlcmVuY2VMaXN0Py5zdWJzdHJpbmcoMSlcbiAgICB9KTtcbiAgfVxuXG4gIGVkaXRSZWNvcmQoZGF0YSwgaW5kZXgpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy5wQ29ubiRcbiAgICAgICAgLmdldEFjdGlvbnNBcGkoKVxuICAgICAgICAub3BlbkVtYmVkZGVkRGF0YU1vZGFsKFxuICAgICAgICAgIHRoaXMuYlVzZVNlcGFyYXRlVmlld0ZvckVkaXQgPyB0aGlzLmVkaXRWaWV3IDogdGhpcy5kZWZhdWx0VmlldyxcbiAgICAgICAgICB0aGlzLnBDb25uJCBhcyBhbnksXG4gICAgICAgICAgdGhpcy5yZWZlcmVuY2VMaXN0U3RyLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIFBDb3JlLmdldENvbnN0YW50cygpLlJFU09VUkNFX1NUQVRVUy5VUERBVEUsXG4gICAgICAgICAgdGhpcy50YXJnZXRDbGFzc0xhYmVsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlUmVjb3JkKGluZGV4KSB7XG4gICAgdGhpcy5wQ29ubiQuZ2V0TGlzdEFjdGlvbnMoKS5kZWxldGVFbnRyeShpbmRleCk7XG4gIH1cblxuICBidWlsZEVsZW1lbnRzRm9yVGFibGUoKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCk7XG4gICAgY29uc3QgZWxlRGF0YTogYW55ID0gW107XG4gICAgdGhpcy5yZWZlcmVuY2VMaXN0LmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSBbXTtcbiAgICAgIHRoaXMucmF3RmllbGRzPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpdGVtID0ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgY29uZmlnOiB7IC4uLml0ZW0uY29uZmlnLCBsYWJlbDogJycsIGRpc3BsYXlNb2RlOiB0aGlzLnJlYWRPbmx5TW9kZSB8fCB0aGlzLmFsbG93RWRpdGluZ0luTW9kYWwgPyAnRElTUExBWV9PTkxZJyA6IHVuZGVmaW5lZCB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUxpc3REYXRhID0gZ2V0UmVmZXJlbmNlTGlzdCh0aGlzLnBDb25uJCk7XG4gICAgICAgIGNvbnN0IGlzRGF0YXBhZ2UgPSByZWZlcmVuY2VMaXN0RGF0YS5zdGFydHNXaXRoKCdEXycpO1xuICAgICAgICBjb25zdCBwYWdlUmVmZXJlbmNlVmFsdWUgPSBpc0RhdGFwYWdlID8gYCR7cmVmZXJlbmNlTGlzdERhdGF9WyR7aW5kZXh9XWAgOiBgJHt0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCl9JHtyZWZlcmVuY2VMaXN0RGF0YX1bJHtpbmRleH1dYDtcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgIG1ldGE6IGl0ZW0sXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6IHBhZ2VSZWZlcmVuY2VWYWx1ZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxpc3Q6IHJlZmVyZW5jZUxpc3REYXRhLFxuICAgICAgICAgICAgaGFzRm9ybTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmlldyA9IFBDb3JlLmNyZWF0ZVBDb25uZWN0KGNvbmZpZyk7XG4gICAgICAgIGRhdGEucHVzaCh2aWV3KTtcbiAgICAgIH0pO1xuICAgICAgZWxlRGF0YS5wdXNoKGRhdGEpO1xuICAgIH0pO1xuICAgIHRoaXMub3JpZ2luYWxFbGVtZW50c0RhdGEgPSBlbGVEYXRhO1xuICAgIHRoaXMuZWxlbWVudHNEYXRhID0gZWxlRGF0YTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImJWaXNpYmxlJFwiPlxuICA8ZGl2IGNsYXNzPVwic2ltcGxlLXRhYmxlLXdyYXBwZXJcIj5cbiAgICA8aDMgKm5nSWY9XCJsYWJlbFwiIGNsYXNzTmFtZT1cImxhYmVsXCIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZFwiPlxuICAgICAge3sgbGFiZWwgfX0gPHNwYW4gY2xhc3M9XCJyZXN1bHRzLWNvdW50XCI+e3sgZ2V0UmVzdWx0c1RleHQoKSB9fTwvc3Bhbj5cbiAgICA8L2gzPlxuICAgIDx0YWJsZSAqbmdJZj1cInJlYWRPbmx5TW9kZSB8fCBhbGxvd0VkaXRpbmdJbk1vZGFsXCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImVsZW1lbnRzRGF0YVwiIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OFwiIGlkPVwicmVhZG9ubHktdGFibGVcIiBtYXRTb3J0PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBwcm9jZXNzZWRGaWVsZHM7IGxldCBpID0gaW5kZXhcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgKGNsaWNrKT1cIl9oZWFkZXJTb3J0Q2xpY2soJGV2ZW50LCBkQ29sKVwiIGFycm93UG9zaXRpb249XCJiZWZvcmVcIj5cbiAgICAgICAgICA8ZGl2Pnt7IGRDb2wuY29uZmlnLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWZpbHRlci1zdmctaWNvblwiIG5hbWU9XCJmaWx0ZXJPbkljb25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImdyb3VwTWVudVwiPlxuICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51U3ZnSWNvbiQgfX1cIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2dyb3VwTWVudT5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfZ3JvdXBCeSgkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZ3JvdXBCeVN2Z0ljb24kIH19XCIgLz48c3Bhbj5Hcm91cCBCeTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJfc2hvd1VuR3JvdXBCeShkQ29sKSAmJiBiR3JvdXBpbmckXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX3VuR3JvdXBCeSgkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZ3JvdXBCeVN2Z0ljb24kIH19XCIgLz48c3Bhbj5Vbmdyb3VwPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfZmlsdGVyKCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBmaWx0ZXJTdmdJY29uJCB9fVwiIC8+PHNwYW4+RmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICAgICAgICAgIFtuYW1lXT1cImVsZW1lbnRbaV0uZ2V0UENvbm5lY3QoKS5nZXRDb21wb25lbnROYW1lKClcIlxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgcENvbm4kOiBlbGVtZW50W2ldLmdldFBDb25uZWN0KCksXG4gICAgICAgICAgICAgIGZvcm1Hcm91cCQ6IGZvcm1Hcm91cCRcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgZXJyb3JNc2c9XCJUYWJsZSB3YW50cyBjb21wb25lbnQgbm90IHlldCBhdmFpbGFibGU6IHt7IGVsZW1lbnRbaV0uZ2V0UENvbm5lY3QoKS5nZXRDb21wb25lbnROYW1lKCkgfX1cIlxuICAgICAgICAgID48L2NvbXBvbmVudC1tYXBwZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiRGVsZXRlSWNvblwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWxsb3dFZGl0aW5nSW5Nb2RhbFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgalwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pY29uXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJ1dGlsaXR5TWVudVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLXV0aWxpdHktY2FyZC1hY3Rpb25zLXN2Zy1pY29uXCIgc3JjPVwie3sgc2V0dGluZ3NTdmdJY29uJCB9fVwiIC8+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8bWF0LW1lbnUgI3V0aWxpdHlNZW51PVwibWF0TWVudVwiIG92ZXJsYXBUcmlnZ2VyPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImVkaXRSZWNvcmQoZWxlbWVudCwgailcIj5FZGl0PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJkZWxldGVSZWNvcmQoailcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIGNsYXNzPVwibWF0LXJvdyBwc2RrLW5vLXJlY29yZHNcIiAqbWF0Tm9EYXRhUm93PlxuICAgICAgICA8dGQgaWQ9XCJuby1yZWNvcmRzXCIgY2xhc3M9XCJtYXQtY2VsbFwiIFthdHRyLmNvbHNwYW5dPVwiZGlzcGxheWVkQ29sdW1ucy5sZW5ndGhcIj5cbiAgICAgICAgICB7eyB1dGlscy5nZXRHZW5lcmljRmllbGRzTG9jYWxpemVkVmFsdWUoJ0Nvc21vc0ZpZWxkcy5maWVsZHMubGlzdHMnLCAnTm8gcmVjb3JkcyBmb3VuZC4nKSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L3RhYmxlPlxuICAgIDx0YWJsZSAqbmdJZj1cImVkaXRhYmxlTW9kZSAmJiAhYWxsb3dFZGl0aW5nSW5Nb2RhbFwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJlbGVtZW50c0RhdGFcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIiBpZD1cImVkaXRhYmxlLXRhYmxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkRGVmczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZENvbC5uYW1lICE9ICdEZWxldGVJY29uJ1wiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5uYW1lXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInBzZGstbWF0LWhlYWRlclwiPnt7IGRDb2wubGFiZWwgfX08L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgICAgICAgICBbbmFtZV09XCJlbGVtZW50W2ldLmdldFBDb25uZWN0KCkuZ2V0Q29tcG9uZW50TmFtZSgpXCJcbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICBwQ29ubiQ6IGVsZW1lbnRbaV0uZ2V0UENvbm5lY3QoKSxcbiAgICAgICAgICAgICAgICBmb3JtR3JvdXAkOiBmb3JtR3JvdXAkXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBlcnJvck1zZz1cIlRhYmxlIHdhbnRzIGNvbXBvbmVudCBub3QgeWV0IGF2YWlsYWJsZToge3sgZWxlbWVudFtpXS5nZXRQQ29ubmVjdCgpLmdldENvbXBvbmVudE5hbWUoKSB9fVwiXG4gICAgICAgICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkRlbGV0ZUljb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgalwiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJkZWxldGVSZWNvcmQoailcIj5cbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLXV0aWxpdHktY2FyZC1hY3Rpb24tc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51SWNvbk92ZXJyaWRlJCB9fVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJtYXQtcm93IHBzZGstbm8tcmVjb3Jkc1wiICptYXROb0RhdGFSb3c+XG4gICAgICAgIDx0ZCBpZD1cIm5vLXJlY29yZHNcIiBjbGFzcz1cIm1hdC1jZWxsXCIgW2F0dHIuY29sc3Bhbl09XCJkaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aFwiPlxuICAgICAgICAgIHt7IHV0aWxzLmdldEdlbmVyaWNGaWVsZHNMb2NhbGl6ZWRWYWx1ZSgnQ29zbW9zRmllbGRzLmZpZWxkcy5saXN0cycsICdObyByZWNvcmRzIGZvdW5kLicpIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuICA8YnV0dG9uICpuZ0lmPVwic2hvd0FkZFJvd0J1dHRvblwiIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgc3R5bGU9XCJmb250LXNpemU6IDE2cHhcIiAoY2xpY2spPVwiYWRkUmVjb3JkKClcIj5cbiAgICArIHt7IGxvY2FsaXplZFZhbCgnQWRkJywgbG9jYWxlQ2F0ZWdvcnkpIH19XG4gIDwvYnV0dG9uPlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gcG9wIG92ZXJzIGZvciBmaWx0ZXJzLS0+XG48ZGl2ICpuZ0lmPVwiYlNob3dGaWx0ZXJQb3BvdmVyJFwiIGNsYXNzPVwicHNkay1kaWFsb2ctYmFja2dyb3VuZFwiPlxuICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1maWxlLXRvcFwiPlxuICAgIDxoND5cbiAgICAgIEZpbHRlcjo8Yj4ge3sgZmlsdGVyQ29udGFpbnNMYWJlbCQgfX08L2I+XG4gICAgPC9oND5cbiAgICA8ZGl2ICpuZ0lmPVwiYkNvbnRhaW5zJFwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1R5cGUkXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUeXBlKCRldmVudClcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImNvbnRhaW5zXCI+Q29udGFpbnM8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJlcXVhbHNcIj5FcXVhbHM8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJzdGFydHN3aXRoXCI+U3RhcnRzIHdpdGg8L21hdC1vcHRpb24+XG4gICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIiAoY2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1ZhbHVlKCRldmVudClcIiAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJiRGF0ZVRpbWUkXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVHlwZSRcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1R5cGUoJGV2ZW50KVwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibm90ZXF1YWxcIj5pcyBub3QgZXF1YWwgdG88L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJhZnRlclwiPmFmdGVyPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiYmVmb3JlXCI+YmVmb3JlPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibnVsbFwiPmlzIG51bGw8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJub3RudWxsXCI+aXMgbm90IG51bGw8L21hdC1vcHRpb24+XG4gICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc0RhdGUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+RGF0ZTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICNkYXRlSW5wdXRcbiAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwZWdhZGF0ZVwiXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiXG4gICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zRGF0ZVZhbHVlKCRldmVudCwgZGF0ZUlucHV0LnZhbHVlKVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGVnYWRhdGVcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwZWdhZGF0ZSBbc3RhcnRBdF09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJiSXNEYXRlVGltZSQgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPT0gJ251bGwnICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT0gJ25vdG51bGwnXCIgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5EYXRlIHRpbWU8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zRGF0ZVRpbWVWYWx1ZSgkZXZlbnQpXCIgLz5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc1RpbWUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+VGltZTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRpbWVcIiBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIiAoY2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1RpbWVWYWx1ZSgkZXZlbnQpXCIgLz5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgW3Byb3BzXT1cInsgYXJNYWluQnV0dG9ucyQ6IGFyRmlsdGVyTWFpbkJ1dHRvbnMkLCBhclNlY29uZGFyeUJ1dHRvbnMkOiBhckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkIH1cIlxuICAgICAgW3BhcmVudF09XCJ0aGlzXCJcbiAgICAgIFtvdXRwdXRFdmVudHNdPVwieyBhY3Rpb25CdXR0b25DbGljazogX29uRmlsdGVyQWN0aW9uQnV0dG9uQ2xpY2sgfVwiXG4gICAgPjwvY29tcG9uZW50LW1hcHBlcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|