@microsoft/windows-admin-center-sdk 4.167.0 → 4.260.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/assets/strings/cs-CZ/strings.json +1 -1
- package/angular/assets/strings/de-DE/strings.json +1 -1
- package/angular/assets/strings/es-ES/strings.json +1 -1
- package/angular/assets/strings/fr-FR/strings.json +1 -1
- package/angular/assets/strings/hu-HU/strings.json +1 -1
- package/angular/assets/strings/id-ID/strings.json +1 -1
- package/angular/assets/strings/it-IT/strings.json +1 -1
- package/angular/assets/strings/ja-JP/strings.json +1 -1
- package/angular/assets/strings/ko-KR/strings.json +1 -1
- package/angular/assets/strings/nl-NL/strings.json +1 -1
- package/angular/assets/strings/pl-PL/strings.json +1 -1
- package/angular/assets/strings/pt-BR/strings.json +1 -1
- package/angular/assets/strings/pt-PT/strings.json +1 -1
- package/angular/assets/strings/ru-RU/strings.json +1 -1
- package/angular/assets/strings/strings.json +1 -1
- package/angular/assets/strings/sv-SE/strings.json +1 -1
- package/angular/assets/strings/tr-TR/strings.json +1 -1
- package/angular/assets/strings/zh-CN/strings.json +1 -1
- package/angular/assets/strings/zh-TW/strings.json +1 -1
- package/angular/esm2020/src/controls/accordion/accordion-panel/accordion-panel.component.mjs +36 -12
- package/angular/esm2020/src/controls/copilot/copilot.component.mjs +55 -0
- package/angular/esm2020/src/controls/copilot/copilot.module.mjs +25 -0
- package/angular/esm2020/src/controls/copilot/index.mjs +3 -0
- package/angular/esm2020/src/controls/data-table/data-table.component.mjs +7 -9
- package/angular/esm2020/src/controls/details/details.component.mjs +62 -25
- package/angular/esm2020/src/controls/details/details.module.mjs +5 -1
- package/angular/esm2020/src/controls/dialog/dialog.component.mjs +35 -23
- package/angular/esm2020/src/controls/form/form-field/array/array-form-field-accessibility-manager.service.mjs +59 -0
- package/angular/esm2020/src/controls/form/form-field/array/array-form-field.component.mjs +24 -35
- package/angular/esm2020/src/controls/form/form-field/form-field-accessibility-manager-base.service.mjs +105 -0
- package/angular/esm2020/src/controls/form/form-field/list/list-form-field-accessibility-manager.service.mjs +38 -0
- package/angular/esm2020/src/controls/form/form-field/list/list-form-field.component.mjs +56 -38
- package/angular/esm2020/src/controls/form/form-field/ordered-list/ordered-list-form-field-accessibility-manager.service.mjs +54 -0
- package/angular/esm2020/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.mjs +67 -67
- package/angular/esm2020/src/controls/form/forms.module.mjs +19 -2
- package/angular/esm2020/src/controls/guided-panel/guided-pane/guided-pane.component.mjs +12 -3
- package/angular/esm2020/src/controls/index.mjs +4 -1
- package/angular/esm2020/src/controls/page-alert-bar/page-alert-bar.component.mjs +4 -4
- package/angular/esm2020/src/controls/snap-in-extension/snap-in-extension.component.mjs +1 -1
- package/angular/esm2020/src/controls/summary/index.mjs +4 -0
- package/angular/esm2020/src/controls/summary/summary-item.mjs +83 -0
- package/angular/esm2020/src/controls/summary/summary.component.mjs +391 -0
- package/angular/esm2020/src/controls/summary/summary.module.mjs +37 -0
- package/angular/esm2020/src/controls/summary-group/index.mjs +3 -0
- package/angular/esm2020/src/controls/summary-group/summary-group.component.mjs +84 -0
- package/angular/esm2020/src/controls/summary-group/summary-group.module.mjs +33 -0
- package/angular/esm2020/src/controls/wizard/models/wizard-step-snap-in-output.mjs +1 -1
- package/angular/esm2020/src/controls/wizard-lite/wizard-navigation-button/wizard-navigation-button.component.mjs +3 -3
- package/angular/esm2020/src/data/extension-broker/snap-in-listener.mjs +80 -0
- package/angular/esm2020/src/data/index.mjs +2 -1
- package/angular/esm2020/src/generated/strings.mjs +1 -1
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs +1798 -597
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
- package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs +1679 -597
- package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
- package/angular/src/controls/accordion/accordion-panel/accordion-panel.component.d.ts +13 -4
- package/angular/src/controls/copilot/copilot.component.d.ts +31 -0
- package/angular/src/controls/copilot/copilot.module.d.ts +8 -0
- package/angular/src/controls/copilot/index.d.ts +2 -0
- package/angular/src/controls/details/details.component.d.ts +5 -1
- package/angular/src/controls/details/details.module.d.ts +3 -2
- package/angular/src/controls/dialog/dialog.component.d.ts +5 -1
- package/angular/src/controls/form/form-field/array/array-form-field-accessibility-manager.service.d.ts +38 -0
- package/angular/src/controls/form/form-field/array/array-form-field.component.d.ts +3 -1
- package/angular/src/controls/form/form-field/form-field-accessibility-manager-base.service.d.ts +37 -0
- package/angular/src/controls/form/form-field/list/list-form-field-accessibility-manager.service.d.ts +25 -0
- package/angular/src/controls/form/form-field/list/list-form-field.component.d.ts +12 -2
- package/angular/src/controls/form/form-field/ordered-list/ordered-list-form-field-accessibility-manager.service.d.ts +37 -0
- package/angular/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.d.ts +12 -8
- package/angular/src/controls/guided-panel/guided-pane/guided-pane.component.d.ts +4 -0
- package/angular/src/controls/index.d.ts +3 -0
- package/angular/src/controls/summary/index.d.ts +3 -0
- package/angular/src/controls/summary/summary-item.d.ts +105 -0
- package/angular/src/controls/summary/summary.component.d.ts +82 -0
- package/angular/src/controls/summary/summary.module.d.ts +11 -0
- package/angular/src/controls/summary-group/index.d.ts +3 -0
- package/angular/src/controls/summary-group/summary-group.component.d.ts +57 -0
- package/angular/src/controls/summary-group/summary-group.module.d.ts +10 -0
- package/angular/src/controls/wizard/models/wizard-step-snap-in-output.d.ts +1 -1
- package/{core → angular/src}/data/extension-broker/snap-in-listener.d.ts +49 -46
- package/angular/src/data/index.d.ts +1 -0
- package/angular/src/generated/strings.d.ts +11 -0
- package/core/async/cancellation.js +316 -0
- package/core/async/index.js +312 -0
- package/core/async/progress.js +312 -0
- package/core/azure/azure-constants.js +316 -0
- package/core/azure/azure-logging.js +316 -0
- package/core/azure/azure-manager.js +316 -0
- package/core/azure/models/aadAppConfig-data.js +312 -0
- package/core/azure/models/azureArcStatusEnum.js +315 -0
- package/core/azure/models/azureTokenResult-data.js +315 -0
- package/core/azure/resources/deployment-operation-request-body.js +316 -0
- package/core/azure/resources/deployment-operation-response.js +312 -0
- package/core/azure/resources/location-data.js +316 -0
- package/core/azure/resources/resource-group-data.js +316 -0
- package/core/azure/resources/subscription-data.js +316 -0
- package/core/base/data-store/browser-storage-data-store.js +312 -0
- package/core/base/data-store/cached-data-store.js +316 -0
- package/core/base/data-store/data-store.js +312 -0
- package/core/base/data-store/local-data-store.js +312 -0
- package/core/base/data-store/memory-data-store.js +312 -0
- package/core/base/data-store/session-data-store.js +316 -0
- package/core/base/date/date-like.js +315 -0
- package/core/base/date/date-range.js +316 -0
- package/core/base/date/date-time.js +312 -0
- package/core/base/date/date-type.js +312 -0
- package/core/base/date/time-unit.js +316 -0
- package/core/base/decorators/base.js +316 -0
- package/core/base/decorators/debounce.decorators.js +316 -0
- package/core/base/decorators/delay.decorator.js +312 -0
- package/core/base/decorators/yield.decorator.js +312 -0
- package/core/base/environment.js +316 -0
- package/core/base/json.js +316 -0
- package/core/base/msft-sme.mock.js +315 -0
- package/core/base/polyfills/array.js +316 -0
- package/core/base/polyfills/string.js +316 -0
- package/core/base/rxjs-lifetime-manager.js +312 -0
- package/core/base/utilities.js +312 -0
- package/core/base/versioned-object.js +316 -0
- package/core/copilot/copilot-extension-service.d.ts +49 -0
- package/core/copilot/copilot-extension-service.d.ts.map +1 -0
- package/core/copilot/copilot-extension-service.js +446 -0
- package/core/copilot/copilot-extension-service.js.map +1 -0
- package/core/copilot/copilot-iframe/iframe-broker-service.d.ts +19 -0
- package/core/copilot/copilot-iframe/iframe-broker-service.d.ts.map +1 -0
- package/core/copilot/copilot-iframe/iframe-broker-service.js +344 -0
- package/core/copilot/copilot-iframe/iframe-broker-service.js.map +1 -0
- package/core/copilot/copilot-iframe/iframe-child-service.d.ts +15 -0
- package/core/copilot/copilot-iframe/iframe-child-service.d.ts.map +1 -0
- package/core/copilot/copilot-iframe/iframe-child-service.js +337 -0
- package/core/copilot/copilot-iframe/iframe-child-service.js.map +1 -0
- package/core/copilot/copilot-iframe/iframe-message-payload.d.ts +4 -0
- package/core/copilot/copilot-iframe/iframe-message-payload.d.ts.map +1 -0
- package/core/copilot/copilot-iframe/iframe-message-payload.js +319 -0
- package/core/copilot/copilot-iframe/iframe-message-payload.js.map +1 -0
- package/core/copilot/copilot-iframe/iframe-message-type.d.ts +4 -0
- package/core/copilot/copilot-iframe/iframe-message-type.d.ts.map +1 -0
- package/core/copilot/copilot-iframe/iframe-message-type.js +319 -0
- package/core/copilot/copilot-iframe/iframe-message-type.js.map +1 -0
- package/core/copilot/copilot-iframe/iframe-message.d.ts +6 -0
- package/core/copilot/copilot-iframe/iframe-message.d.ts.map +1 -0
- package/core/copilot/copilot-iframe/iframe-message.js +315 -0
- package/core/copilot/copilot-iframe/iframe-message.js.map +1 -0
- package/core/data/accessibility-manager.js +316 -0
- package/core/data/active-directory/active-directory.js +312 -0
- package/core/data/active-directory/models/account-info.js +316 -0
- package/core/data/active-directory/models/active-directory-search-options.js +312 -0
- package/core/data/active-directory/models/search-type.js +315 -0
- package/core/data/animation.js +312 -0
- package/core/data/app-context.js +316 -0
- package/core/data/asset-manager.js +316 -0
- package/core/data/base64-array-buffer.js +312 -0
- package/core/data/batch-connection.js +316 -0
- package/core/data/cim-connection.js +312 -0
- package/core/data/cim-stream.js +312 -0
- package/core/data/cim.js +316 -0
- package/core/data/column-picker.js +315 -0
- package/core/data/cookie.js +316 -0
- package/core/data/core-environment.js +312 -0
- package/core/data/crypto.js +312 -0
- package/core/data/deployment-share.js +316 -0
- package/core/data/disposable.js +316 -0
- package/core/data/electron.js +316 -0
- package/core/data/error-extended.js +316 -0
- package/core/data/extension-broker/dialog-listener.js +312 -0
- package/core/data/extension-broker/extension-broker.js +316 -0
- package/core/data/extension-broker/extension-listener.js +316 -0
- package/core/data/extension-broker/model/extension-broker-request-payload.js +316 -0
- package/core/data/extension-broker/model/extension-broker-response-error.js +315 -0
- package/core/data/extension-broker/model/extension-broker-response-payload.js +316 -0
- package/core/data/extension-broker/model/extension-entries.js +315 -0
- package/core/data/extension-broker/model/extension-instance.js +316 -0
- package/core/data/extension-broker/model/extension-rect.js +316 -0
- package/core/data/extension-broker/model/extension-search-options.js +316 -0
- package/core/data/extension-broker/service-listener.js +315 -0
- package/core/data/extension-broker/worker-listener.js +315 -0
- package/core/data/extension-broker/worker-set.js +316 -0
- package/core/data/file-transfer.js +316 -0
- package/core/data/gateway-connection.js +316 -0
- package/core/data/gateway-status.js +316 -0
- package/core/data/gateway-url-builder.js +316 -0
- package/core/data/gateway-url-translator.js +316 -0
- package/core/data/gateway-urls.js +316 -0
- package/core/data/globalization.js +315 -0
- package/core/data/http-constants.js +316 -0
- package/core/data/http.js +316 -0
- package/core/data/jobs/jobs-manager.js +316 -0
- package/core/data/jobs/models/job-credentials.js +312 -0
- package/core/data/jobs/models/job-node.js +316 -0
- package/core/data/jobs/models/job-paginated-response.js +312 -0
- package/core/data/jobs/models/job-pagination-options.js +316 -0
- package/core/data/jobs/models/job.js +316 -0
- package/core/data/jobs/models/node-job.js +316 -0
- package/core/data/jobs/models/powershell-job.js +312 -0
- package/core/data/language.js +312 -0
- package/core/data/lifetime-data.js +316 -0
- package/core/data/localization-manager.js +316 -0
- package/core/data/native-q.js +312 -0
- package/core/data/net.d.ts.map +1 -1
- package/core/data/net.js +317 -1
- package/core/data/net.js.map +1 -1
- package/core/data/node-connection.d.ts.map +1 -1
- package/core/data/node-connection.js +316 -0
- package/core/data/node-connection.js.map +1 -1
- package/core/data/node-extension-install.js +316 -0
- package/core/data/powershell-alternate.js +316 -0
- package/core/data/powershell-batch.js +312 -0
- package/core/data/powershell-connection.js +312 -0
- package/core/data/powershell-crypto.js +316 -0
- package/core/data/powershell-stream.js +315 -0
- package/core/data/powershell.js +316 -0
- package/core/data/query-cache.js +312 -0
- package/core/data/resource-cache.js +312 -0
- package/core/data/schedule-reboot.js +315 -0
- package/core/data/settings-manager.js +316 -0
- package/core/data/settings-manger.mock.js +315 -0
- package/core/data/sme-extension.js +312 -0
- package/core/data/ssh-stream.js +316 -0
- package/core/data/units.js +312 -0
- package/core/data/uri-builder.js +316 -0
- package/core/data/wdac-operations.js +315 -0
- package/core/data/websocket-stream.js +316 -0
- package/core/diagnostics/error-monitor.js +316 -0
- package/core/diagnostics/log-level.js +316 -0
- package/core/diagnostics/log-record.js +312 -0
- package/core/diagnostics/logging-constants.js +316 -0
- package/core/diagnostics/logging.js +316 -0
- package/core/diagnostics/logging.mock.js +316 -0
- package/core/diagnostics/sme-web-telemetry-models.js +316 -0
- package/core/diagnostics/sme-web-telemetry.d.ts +1 -2
- package/core/diagnostics/sme-web-telemetry.d.ts.map +1 -1
- package/core/diagnostics/sme-web-telemetry.js +339 -15
- package/core/diagnostics/sme-web-telemetry.js.map +1 -1
- package/core/diagnostics/telemetry-control-type.js +316 -0
- package/core/diagnostics/telemetry-options.js +316 -0
- package/core/diagnostics/telemetry-record.js +316 -0
- package/core/dom/dom.js +316 -0
- package/core/frame/frame-connection.js +316 -0
- package/core/frame/frame-connection.mock.js +316 -0
- package/core/frame/shell-navigation-connection.js +316 -0
- package/core/generated/powershell-scripts.d.ts.map +1 -1
- package/core/generated/powershell-scripts.js +313 -1
- package/core/generated/powershell-scripts.js.map +1 -1
- package/core/generated/strings.js +312 -0
- package/core/host/host-core-manager.js +316 -0
- package/core/host/host-core-message-type.js +316 -0
- package/core/host/host-core-messages.js +312 -0
- package/core/index.d.ts +48 -25
- package/core/index.d.ts.map +1 -1
- package/core/index.js +351 -18
- package/core/index.js.map +1 -1
- package/core/manifest/environment-modules.d.ts +3 -1
- package/core/manifest/environment-modules.d.ts.map +1 -1
- package/core/manifest/environment-modules.js +314 -0
- package/core/manifest/environment-modules.js.map +1 -1
- package/core/manifest/manifest-loader.js +312 -0
- package/core/manifest/module-schema.json +3 -1
- package/core/notification/client-notification-instance.js +316 -0
- package/core/notification/client-notification.js +316 -0
- package/core/notification/notification-connection.js +316 -0
- package/core/notification/notification-link-type.js +312 -0
- package/core/notification/notification-manager.js +312 -0
- package/core/notification/notification-message.js +312 -0
- package/core/notification/notification-state.js +316 -0
- package/core/notification/notification.js +312 -0
- package/core/notification/powershell-notification.js +316 -0
- package/core/notification/socket-signalr.js +312 -0
- package/core/notification/work-item-connection.js +312 -0
- package/core/notification/work-item-manager.js +316 -0
- package/core/notification/work-item-request.js +315 -0
- package/core/performance/performance-profile-data-type.js +315 -0
- package/core/performance/performance-profile-data.js +315 -0
- package/core/performance/performance-profile-database.js +315 -0
- package/core/performance/performance-profile-record.js +316 -0
- package/core/performance/performance-profile.d.ts.map +1 -1
- package/core/performance/performance-profile.js +325 -9
- package/core/performance/performance-profile.js.map +1 -1
- package/core/performance/performance-tracker.js +312 -0
- package/core/polyfills.js +316 -0
- package/core/resources/scripts/public/crypto/Get-DecryptedDataFromNode.ps1 +219 -0
- package/core/resources/scripts/public/crypto/Get-EncryptionJWKOnNode.ps1 +218 -0
- package/core/resources/scripts/public/inventory/Get-CimWin32LogicalDisk.ps1 +218 -0
- package/core/resources/scripts/public/inventory/Get-CimWin32NetworkAdapter.ps1 +216 -0
- package/core/resources/scripts/public/inventory/Get-CimWin32PhysicalMemory.ps1 +216 -0
- package/core/resources/scripts/public/inventory/Get-CimWin32Processor.ps1 +218 -0
- package/core/resources/scripts/public/inventory/Get-ClusterInventory.ps1 +218 -0
- package/core/resources/scripts/public/inventory/Get-ClusterNodes.ps1 +218 -0
- package/core/resources/scripts/public/inventory/Get-ServerInventory.ps1 +221 -1
- package/core/rpc/alive/rpc-alive-client.js +312 -0
- package/core/rpc/alive/rpc-alive-handler.js +312 -0
- package/core/rpc/alive/rpc-alive-model.js +316 -0
- package/core/rpc/alive/rpc-alive-subject-server.js +312 -0
- package/core/rpc/alive/rpc-observable-alive-client.js +316 -0
- package/core/rpc/alive/rpc-observable-alive-model.js +315 -0
- package/core/rpc/alive/rpc-observable-alive-server.js +315 -0
- package/core/rpc/azure/rpc-azure-model.js +312 -0
- package/core/rpc/azure/rpc-azure-request-client.js +312 -0
- package/core/rpc/azure/rpc-azure-request-handler.js +316 -0
- package/core/rpc/azure/rpc-azure-request-subject-server.js +316 -0
- package/core/rpc/azure/rpc-azure-response-client.js +316 -0
- package/core/rpc/azure/rpc-azure-response-handler.js +312 -0
- package/core/rpc/copilot/rpc-observable-copilot-client.d.ts +24 -0
- package/core/rpc/copilot/rpc-observable-copilot-client.d.ts.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-client.js +343 -0
- package/core/rpc/copilot/rpc-observable-copilot-client.js.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-config-client.d.ts +24 -0
- package/core/rpc/copilot/rpc-observable-copilot-config-client.d.ts.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-config-client.js +343 -0
- package/core/rpc/copilot/rpc-observable-copilot-config-client.js.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-config-server.d.ts +14 -0
- package/core/rpc/copilot/rpc-observable-copilot-config-server.d.ts.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-config-server.js +332 -0
- package/core/rpc/copilot/rpc-observable-copilot-config-server.js.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-model.d.ts +55 -0
- package/core/rpc/copilot/rpc-observable-copilot-model.d.ts.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-model.js +334 -0
- package/core/rpc/copilot/rpc-observable-copilot-model.js.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-server.d.ts +14 -0
- package/core/rpc/copilot/rpc-observable-copilot-server.d.ts.map +1 -0
- package/core/rpc/copilot/rpc-observable-copilot-server.js +333 -0
- package/core/rpc/copilot/rpc-observable-copilot-server.js.map +1 -0
- package/core/rpc/credssp/rpc-credssp-model.js +315 -0
- package/core/rpc/credssp/rpc-credssp-request-client.js +316 -0
- package/core/rpc/credssp/rpc-credssp-request-handler.js +316 -0
- package/core/rpc/credssp/rpc-credssp-request-subject-server.js +316 -0
- package/core/rpc/credssp/rpc-credssp-response-client.js +316 -0
- package/core/rpc/credssp/rpc-credssp-response-handler.js +316 -0
- package/core/rpc/dialog/rpc-dialog-client.js +312 -0
- package/core/rpc/dialog/rpc-dialog-handler.js +315 -0
- package/core/rpc/dialog/rpc-dialog-model.js +316 -0
- package/core/rpc/dialog/rpc-dialog-subject-server.js +316 -0
- package/core/rpc/electron/rpc-electron-model.js +316 -0
- package/core/rpc/electron/rpc-electron-request-client.js +316 -0
- package/core/rpc/electron/rpc-electron-request-handler.js +315 -0
- package/core/rpc/electron/rpc-electron-request-subject-server.js +316 -0
- package/core/rpc/electron/rpc-electron-response-client.js +312 -0
- package/core/rpc/electron/rpc-electron-response-handler.js +315 -0
- package/core/rpc/elevate/rpc-observable-elevate-client.js +315 -0
- package/core/rpc/elevate/rpc-observable-elevate-model.js +312 -0
- package/core/rpc/elevate/rpc-observable-elevate-server.js +312 -0
- package/core/rpc/error-monitor/rpc-observable-error-monitor-client.js +316 -0
- package/core/rpc/error-monitor/rpc-observable-error-monitor-model.js +316 -0
- package/core/rpc/error-monitor/rpc-observable-error-monitor-server.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-model.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-module-request-subject-server.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-request-client.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-request-handler.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-request-subject-server.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-response-client.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-response-handler.js +312 -0
- package/core/rpc/extension-data/rpc-observable-extension-data-client.js +316 -0
- package/core/rpc/extension-data/rpc-observable-extension-data-model.js +312 -0
- package/core/rpc/extension-data/rpc-observable-extension-data-server.js +315 -0
- package/core/rpc/forward/rpc-forward-auto-client.js +315 -0
- package/core/rpc/forward/rpc-forward-down-client.js +315 -0
- package/core/rpc/forward/rpc-forward-down-handler.js +316 -0
- package/core/rpc/forward/rpc-forward-model.js +316 -0
- package/core/rpc/forward/rpc-forward-up-client.js +312 -0
- package/core/rpc/forward/rpc-forward-up-handler.js +316 -0
- package/core/rpc/forward/rpc-forward-up-subject-server.js +316 -0
- package/core/rpc/log/rpc-log-client.js +316 -0
- package/core/rpc/log/rpc-log-handler.js +312 -0
- package/core/rpc/log/rpc-log-model.js +316 -0
- package/core/rpc/log/rpc-log-subject-server.js +316 -0
- package/core/rpc/notification/rpc-notification-client.js +316 -0
- package/core/rpc/notification/rpc-notification-handler.js +312 -0
- package/core/rpc/notification/rpc-notification-model.js +316 -0
- package/core/rpc/notification/rpc-notification-subject-server.js +312 -0
- package/core/rpc/overlay/rpc-overlay-close-client.js +312 -0
- package/core/rpc/overlay/rpc-overlay-close-handler.js +316 -0
- package/core/rpc/overlay/rpc-overlay-model.js +312 -0
- package/core/rpc/overlay/rpc-overlay-open-client.js +312 -0
- package/core/rpc/overlay/rpc-overlay-open-handler.js +316 -0
- package/core/rpc/overlay/rpc-overlay-open-subject-server.js +316 -0
- package/core/rpc/performance/rpc-observable-performance-client.js +315 -0
- package/core/rpc/performance/rpc-observable-performance-config-client.js +312 -0
- package/core/rpc/performance/rpc-observable-performance-config-server.js +316 -0
- package/core/rpc/performance/rpc-observable-performance-model.js +312 -0
- package/core/rpc/performance/rpc-observable-performance-server.js +312 -0
- package/core/rpc/report/rpc-report-client.js +316 -0
- package/core/rpc/report/rpc-report-handler.js +315 -0
- package/core/rpc/report/rpc-report-model.js +315 -0
- package/core/rpc/report/rpc-report-subject-server.js +312 -0
- package/core/rpc/rpc-base.d.ts +4 -0
- package/core/rpc/rpc-base.d.ts.map +1 -1
- package/core/rpc/rpc-base.js +316 -0
- package/core/rpc/rpc-base.js.map +1 -1
- package/core/rpc/rpc-channel.js +316 -0
- package/core/rpc/rpc-forwarder.js +312 -0
- package/core/rpc/rpc-inbound-client.js +315 -0
- package/core/rpc/rpc-inbound.js +312 -0
- package/core/rpc/rpc-manager.js +316 -0
- package/core/rpc/rpc-module-subject-server.js +316 -0
- package/core/rpc/rpc-observable-client.js +316 -0
- package/core/rpc/rpc-observable-request.js +316 -0
- package/core/rpc/rpc-observable-result.js +316 -0
- package/core/rpc/rpc-observable-server.js +316 -0
- package/core/rpc/rpc-outbound-client.js +316 -0
- package/core/rpc/rpc-outbound.js +315 -0
- package/core/rpc/rpc-subject-server.js +316 -0
- package/core/rpc/rpc.js +316 -0
- package/core/rpc/seek/rpc-seek-client.js +316 -0
- package/core/rpc/seek/rpc-seek-handler.js +315 -0
- package/core/rpc/seek/rpc-seek-model.js +315 -0
- package/core/rpc/settings/rpc-settings-client.js +312 -0
- package/core/rpc/settings/rpc-settings-handler.js +315 -0
- package/core/rpc/settings/rpc-settings-model.js +315 -0
- package/core/rpc/settings/rpc-settings-subject-server.js +312 -0
- package/core/rpc/shell-navigate/rpc-shell-navigate-client.js +316 -0
- package/core/rpc/shell-navigate/rpc-shell-navigate-handler.js +316 -0
- package/core/rpc/shell-navigate/rpc-shell-navigate-model.js +315 -0
- package/core/rpc/shell-navigate/rpc-shell-navigate-subject-server.js +315 -0
- package/core/rpc/sme-extension/rpc-sme-extension-model.js +316 -0
- package/core/rpc/sme-extension/rpc-sme-extension-request-client.js +316 -0
- package/core/rpc/sme-extension/rpc-sme-extension-request-handler.js +312 -0
- package/core/rpc/sme-extension/rpc-sme-extension-request-subject-server.js +312 -0
- package/core/rpc/sme-extension/rpc-sme-extension-response-client.js +316 -0
- package/core/rpc/sme-extension/rpc-sme-extension-response-handler.js +316 -0
- package/core/rpc/telemetry/rpc-telemetry-client.js +312 -0
- package/core/rpc/telemetry/rpc-telemetry-handler.js +312 -0
- package/core/rpc/telemetry/rpc-telemetry-model.js +312 -0
- package/core/rpc/telemetry/rpc-telemetry-subject-server.js +316 -0
- package/core/rpc/update-data/rpc-update-data-client.js +316 -0
- package/core/rpc/update-data/rpc-update-data-handler.js +312 -0
- package/core/rpc/update-data/rpc-update-data-model.js +312 -0
- package/core/rpc/update-data/rpc-update-data-subject-server.js +312 -0
- package/core/rpc/update-theme/rpc-observable-update-theme-client.js +316 -0
- package/core/rpc/update-theme/rpc-observable-update-theme-model.js +315 -0
- package/core/rpc/update-theme/rpc-observable-update-theme-server.js +316 -0
- package/core/rpc/work-item/rpc-work-item-client.js +315 -0
- package/core/rpc/work-item/rpc-work-item-handler.js +312 -0
- package/core/rpc/work-item/rpc-work-item-model.js +316 -0
- package/core/rpc/work-item/rpc-work-item-subject-server.js +316 -0
- package/core/rpc/work-item-find/rpc-work-item-find-client.js +312 -0
- package/core/rpc/work-item-find/rpc-work-item-find-handler.js +315 -0
- package/core/rpc/work-item-find/rpc-work-item-find-model.js +316 -0
- package/core/rpc/work-item-find/rpc-work-item-find-subject-server.js +312 -0
- package/core/security/active-connection.js +315 -0
- package/core/security/authorization-manager.js +315 -0
- package/core/security/connection-manager-settings/common-connection-settings.js +316 -0
- package/core/security/connection-manager-settings/connection-settings.js +315 -0
- package/core/security/connection-manager.js +316 -0
- package/core/security/connection-stream.js +316 -0
- package/core/security/connection.js +312 -0
- package/core/security/credssp-manager.js +315 -0
- package/core/security/sign-on-manager.js +316 -0
- package/core/security/tag-manager.js +315 -0
- package/core/security/tool-condition-validator.js +316 -0
- package/core/security/tool-connection-query.js +312 -0
- package/core/security/user-principal.js +312 -0
- package/core/shared/cluster-inventory/cluster-inventory-cache.js +316 -0
- package/core/shared/cluster-inventory/cluster-inventory.js +315 -0
- package/core/shared/cluster-inventory/cluster-node-inventory.js +316 -0
- package/core/shared/gateway-inventory/gateway-inventory-cache.js +316 -0
- package/core/shared/gateway-inventory/gateway-inventory-detail-cache.js +316 -0
- package/core/shared/gateway-inventory/gateway-inventory-detail.js +316 -0
- package/core/shared/gateway-inventory/gateway-inventory.js +316 -0
- package/core/shared/inventory-query-caches.js +316 -0
- package/core/shared/server-inventory/server-inventory-cache.d.ts.map +1 -1
- package/core/shared/server-inventory/server-inventory-cache.js +313 -0
- package/core/shared/server-inventory/server-inventory-cache.js.map +1 -1
- package/core/shared/server-inventory/server-inventory-detail-cache.js +315 -0
- package/core/shared/server-inventory/server-inventory-detail.js +316 -0
- package/core/shared/server-inventory/server-inventory.d.ts +8 -0
- package/core/shared/server-inventory/server-inventory.d.ts.map +1 -1
- package/core/shared/server-inventory/server-inventory.js +320 -0
- package/core/shared/server-inventory/server-inventory.js.map +1 -1
- package/core/shared/shared-cache.js +312 -0
- package/core/shared/tool-inventory/tool-inventory-cache.js +312 -0
- package/core/shared/tool-inventory/tool-inventory.js +316 -0
- package/core/special.js +316 -0
- package/core/test-utilities/accessibility-tester.js +316 -0
- package/core/test-utilities/console.mock.js +316 -0
- package/core/test-utilities/jasmine-axe-matcher.js +316 -0
- package/core/test-utilities/wait-async.js +315 -0
- package/core/test.js +312 -0
- package/core/testing.js +316 -0
- package/core/workflow/persistent-local-storage.js +316 -0
- package/core/workflow/persistent-work-item-apply-state.js +316 -0
- package/core/workflow/persistent-work-item-state.js +316 -0
- package/core/workflow/persistent-work-item.js +316 -0
- package/core/workflow/persistent-workflow-builder.js +316 -0
- package/core/workflow/persistent-workflow-context.js +315 -0
- package/core/workflow/persistent-workflow-runner.js +316 -0
- package/core/workflow/persistent-workflow-snapshot.js +315 -0
- package/core/workflow/persistent-workflow-store.js +312 -0
- package/core/workflow/persistent-workflow.js +312 -0
- package/package.json +7 -6
- package/styles/css/main-v2.css +1 -1
- package/styles/fonts/SegoeUI/Bold/SegoeUIBold-5.27.woff +0 -0
- package/styles/fonts/SegoeUI/Light/SegoeUILight-5.27.woff +0 -0
- package/styles/fonts/SegoeUI/Normal/SegoeUI-5.27.woff +0 -0
- package/styles/fonts/SegoeUI/SemiBold/SegoeUISemiBold-5.27.woff +0 -0
- package/styles/fonts/SegoeUI/SemiLight/SegoeUISemiLight-5.27.woff +0 -0
- package/styles/fonts/ServMDL2/ServMDL2-4.66.woff +0 -0
- package/tools/build/webpack/index-html.transform.js +312 -0
- package/tools/build/webpack/shell.index-html.transform.js +316 -0
- package/tools/build/webpack/shell.webpack.config.js +312 -0
- package/tools/build/webpack/webpack.config.js +312 -0
- package/tools/code-formatter/.eslintrc.base.json +2 -1
- package/tools/code-formatter/lint.js +316 -0
- package/tools/code-formatter/utilities.d.ts.map +1 -1
- package/tools/code-formatter/utilities.js +313 -1
- package/tools/code-formatter/utilities.js.map +1 -1
- package/tools/gulp-doc-generator/index.js +316 -0
- package/tools/gulp-manifest-resource/index.js +315 -0
- package/tools/gulp-manifest-validator/index.js +316 -0
- package/tools/gulp-merge-json-in-folders/index.js +316 -0
- package/tools/gulp-merge-json-in-folders/json-merge.js +316 -0
- package/tools/gulp-ps-cim/index.js +316 -0
- package/tools/gulp-ps-code/index.d.ts.map +1 -1
- package/tools/gulp-ps-code/index.js +326 -2
- package/tools/gulp-ps-code/index.js.map +1 -1
- package/tools/gulp-ps-code/ps-code-convert.js +316 -0
- package/tools/gulp-ps-manifest/index.js +312 -0
- package/tools/gulp-ps-module/index.d.ts.map +1 -1
- package/tools/gulp-ps-module/index.js +328 -3
- package/tools/gulp-ps-module/index.js.map +1 -1
- package/tools/gulp-ps-resjson/index.js +316 -0
- package/tools/gulp-resjson/index.js +312 -0
- package/tools/gulp-resjson/resjson-convert.js +316 -0
- package/tools/gulp-schema-form/index.js +312 -0
- package/tools/gulp-svg-code/index.js +316 -0
- package/tools/gulp-svg-code/svg-code-convert.js +312 -0
- package/tools/gulp-update-notes-resource/index.js +312 -0
- package/tools/module-template/build/increment-package-version.ps1 +219 -0
- package/tools/module-template/build/pipelines/ci-build.yml +5 -5
- package/tools/module-template/build/pipelines/pull-request.yml +4 -4
- package/tools/module-template/build/push-incremented-version.ps1 +218 -1
- package/tools/module-template/build/update-powershell-code.ps1 +216 -0
- package/tools/module-template/gulpfile.ts/common/clean.ts +2 -0
- package/tools/module-template/gulpfile.ts/common/pack.ts +17 -5
- package/tools/module-template/gulpfile.ts/common/powershell.ts +40 -2
- package/tools/module-template/gulpfile.ts/common/test.ts +2 -3
- package/tools/module-template/gulpfile.ts/common/utilities.ts +40 -12
- package/tools/pack-nuget/index.d.ts.map +1 -1
- package/tools/pack-nuget/index.js +325 -3
- package/tools/pack-nuget/index.js.map +1 -1
- package/tools/scripts/Invoke-PesterTest.ps1 +218 -0
- package/tools/scripts/New-ExtensionPackage.ps1 +373 -6
- package/tools/scripts/Search-NonAsciiText.ps1 +219 -0
- package/tools/scripts/package-information/README.md +3 -0
- package/tools/scripts/package-information/ms-logo.png +0 -0
- package/tools/test-runner/index.js +316 -0
- package/tools/utilities/index.js +312 -0
- package/tools/wac-cli/src/angular15/configs/angular-json-config.js +315 -0
- package/tools/wac-cli/src/angular15/configs/ci-build-yml-config.js +315 -0
- package/tools/wac-cli/src/angular15/configs/config.js +312 -0
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.js +315 -0
- package/tools/wac-cli/src/angular15/configs/git-ignore-config.js +315 -0
- package/tools/wac-cli/src/angular15/configs/jasmine-test-config.js +316 -0
- package/tools/wac-cli/src/angular15/configs/package-json-config.js +316 -0
- package/tools/wac-cli/src/angular15/configs/replace-config.js +312 -0
- package/tools/wac-cli/src/angular15/configs/tsconfig-config.js +316 -0
- package/tools/wac-cli/src/angular15/configs/ui-test-automation-lagacy-config.js +316 -0
- package/tools/wac-cli/src/angular15/main.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/angular-json-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/ajax-response-updater.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/css-syntax-error-updater.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/declare-override-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/error-updater-angular15.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/form-control-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/iif-updater-util.js +315 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/load-children-callback-updater.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/log-parser.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/observable-throw-updater.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/parameter-count-violation-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/string-replace-updater.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/subjuct-next-updater-util.js +315 -0
- package/tools/wac-cli/src/angular15/upgrader/ci-build-yml-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/file-replacement-upgrader.js +315 -0
- package/tools/wac-cli/src/angular15/upgrader/git-ignore-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/jasmine-test-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/package-json-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/remove-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/replace-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/tsconfig-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/ui-test-automation-legacy-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/version-json-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/utils/add-item.js +312 -0
- package/tools/wac-cli/src/angular15/utils/command-runner.js +316 -0
- package/tools/wac-cli/src/angular15/utils/file-comparison.js +316 -0
- package/tools/wac-cli/src/angular15/utils/file-replacement.js +315 -0
- package/tools/wac-cli/src/angular15/utils/file-writer.js +312 -0
- package/tools/wac-cli/src/angular15/utils/logger.js +312 -0
- package/tools/wac-cli/src/angular15/utils/main-debugger.js +312 -0
- package/tools/wac-cli/src/angular15/utils/relative-path.js +316 -0
- package/tools/wac-cli/src/angular15/utils/remove-item.js +316 -0
- package/tools/wac-cli/src/angular15/utils/space-generator.js +312 -0
- package/tools/wac-cli/src/angular15/utils/update-shell-references.js +312 -0
- package/tools/wac-cli/src/common.js +316 -0
- package/tools/wac-cli/src/create/main.js +316 -0
- package/tools/wac-cli/src/eslint/main.js +312 -0
- package/tools/wac-cli/src/index.js +316 -0
- package/tools/wac-cli/src/upgrade/error-updater.js +312 -0
- package/tools/wac-cli/src/upgrade/error-updaters/component-selector-updater.js +312 -0
- package/tools/wac-cli/src/upgrade/error-updaters/only-arrow-functions-updater.js +316 -0
- package/tools/wac-cli/src/upgrade/error-updaters/updater-lookup.js +312 -0
- package/tools/wac-cli/src/upgrade/file-updater.js +316 -0
- package/tools/wac-cli/src/upgrade/get-files.js +312 -0
- package/tools/wac-cli/src/upgrade/main.js +316 -0
- package/tools/wac-cli/src/upgrade/models/error-result.js +316 -0
- package/tools/wac-cli/src/upgrade/models/updater-interface.js +316 -0
- package/tools/wac-cli/src/upgrade/package-updater.js +316 -0
- package/tools/wac-cli/templates/wac-template/package.json +1 -1
- package/tools/wac-cli/templates/wac-template/src/favicon.ico +0 -0
- package/tools/wac-cli/templates/wac-template/src/karma.conf.js +317 -1
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Error.ps1 +218 -0
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Exception.ps1 +216 -0
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Process.ps1 +216 -1
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Service.ps1 +216 -1
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-WinRmState.ps1 +218 -1
- package/core/data/extension-broker/snap-in-listener.d.ts.map +0 -1
- package/core/data/extension-broker/snap-in-listener.js +0 -73
- package/core/data/extension-broker/snap-in-listener.js.map +0 -1
- package/microsoft-windows-admin-center-sdk-4.167.0.tgz +0 -0
|
@@ -64,12 +64,11 @@ function DataTableComponent_div_7_div_1_Template(rf, ctx) { if (rf & 1) {
|
|
|
64
64
|
const column_r18 = i0.ɵɵnextContext().$implicit;
|
|
65
65
|
const ctx_r20 = i0.ɵɵnextContext();
|
|
66
66
|
i0.ɵɵproperty("title", column_r18.header);
|
|
67
|
-
i0.ɵɵattribute("aria-sort", ctx_r20.columnSortSettings[column_r18.header]);
|
|
67
|
+
i0.ɵɵattribute("aria-sort", ctx_r20.columnSortSettings[column_r18.header])("aria-label", column_r18.sortable ? ctx_r20.getSortLabel(column_r18) : null);
|
|
68
68
|
i0.ɵɵadvance(2);
|
|
69
69
|
i0.ɵɵtextInterpolate(column_r18.header);
|
|
70
70
|
i0.ɵɵadvance(1);
|
|
71
71
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(5, _c12, column_r18.sortMode === ctx_r20.sortModeEnum.Ascend, column_r18.sortMode === ctx_r20.sortModeEnum.Descend));
|
|
72
|
-
i0.ɵɵattribute("aria-label", column_r18.sortable ? ctx_r20.getSortLabel(column_r18) : null);
|
|
73
72
|
} }
|
|
74
73
|
function DataTableComponent_div_7_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
75
74
|
i0.ɵɵelementStart(0, "div", 39)(1, "span");
|
|
@@ -81,11 +80,11 @@ function DataTableComponent_div_7_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
|
81
80
|
const column_r18 = i0.ɵɵnextContext().$implicit;
|
|
82
81
|
const ctx_r21 = i0.ɵɵnextContext();
|
|
83
82
|
i0.ɵɵproperty("title", column_r18.header);
|
|
83
|
+
i0.ɵɵattribute("aria-label", column_r18.sortable ? ctx_r21.getSortLabel(column_r18) : null);
|
|
84
84
|
i0.ɵɵadvance(2);
|
|
85
85
|
i0.ɵɵtextInterpolate(column_r18.header);
|
|
86
86
|
i0.ɵɵadvance(1);
|
|
87
87
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(4, _c12, column_r18.sortMode === ctx_r21.sortModeEnum.Ascend, column_r18.sortMode === ctx_r21.sortModeEnum.Descend));
|
|
88
|
-
i0.ɵɵattribute("aria-label", column_r18.sortable ? ctx_r21.getSortLabel(column_r18) : null);
|
|
89
88
|
} }
|
|
90
89
|
function DataTableComponent_div_7_div_3_Template(rf, ctx) { if (rf & 1) {
|
|
91
90
|
i0.ɵɵelement(0, "div", 40);
|
|
@@ -754,12 +753,11 @@ function TreeTableComponent_div_7_div_1_Template(rf, ctx) { if (rf & 1) {
|
|
|
754
753
|
const column_r18 = i0.ɵɵnextContext().$implicit;
|
|
755
754
|
const ctx_r20 = i0.ɵɵnextContext();
|
|
756
755
|
i0.ɵɵproperty("title", column_r18.header);
|
|
757
|
-
i0.ɵɵattribute("aria-sort", ctx_r20.columnSortSettings[column_r18.header]);
|
|
756
|
+
i0.ɵɵattribute("aria-sort", ctx_r20.columnSortSettings[column_r18.header])("aria-label", column_r18.sortable ? ctx_r20.getSortLabel(column_r18) : null);
|
|
758
757
|
i0.ɵɵadvance(2);
|
|
759
758
|
i0.ɵɵtextInterpolate(column_r18.header);
|
|
760
759
|
i0.ɵɵadvance(1);
|
|
761
760
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(5, _c12, column_r18.sortMode === ctx_r20.sortModeEnum.Ascend, column_r18.sortMode === ctx_r20.sortModeEnum.Descend));
|
|
762
|
-
i0.ɵɵattribute("aria-label", column_r18.sortable ? ctx_r20.getSortLabel(column_r18) : null);
|
|
763
761
|
} }
|
|
764
762
|
function TreeTableComponent_div_7_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
765
763
|
i0.ɵɵelementStart(0, "div", 39)(1, "span");
|
|
@@ -771,11 +769,11 @@ function TreeTableComponent_div_7_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
|
771
769
|
const column_r18 = i0.ɵɵnextContext().$implicit;
|
|
772
770
|
const ctx_r21 = i0.ɵɵnextContext();
|
|
773
771
|
i0.ɵɵproperty("title", column_r18.header);
|
|
772
|
+
i0.ɵɵattribute("aria-label", column_r18.sortable ? ctx_r21.getSortLabel(column_r18) : null);
|
|
774
773
|
i0.ɵɵadvance(2);
|
|
775
774
|
i0.ɵɵtextInterpolate(column_r18.header);
|
|
776
775
|
i0.ɵɵadvance(1);
|
|
777
776
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(4, _c12, column_r18.sortMode === ctx_r21.sortModeEnum.Ascend, column_r18.sortMode === ctx_r21.sortModeEnum.Descend));
|
|
778
|
-
i0.ɵɵattribute("aria-label", column_r18.sortable ? ctx_r21.getSortLabel(column_r18) : null);
|
|
779
777
|
} }
|
|
780
778
|
function TreeTableComponent_div_7_div_3_Template(rf, ctx) { if (rf & 1) {
|
|
781
779
|
i0.ɵɵelement(0, "div", 40);
|
|
@@ -5286,7 +5284,7 @@ __decorate([
|
|
|
5286
5284
|
], DataTableComponent.prototype, "setIsColumnWidthCalculated", null);
|
|
5287
5285
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataTableComponent, [{
|
|
5288
5286
|
type: Component,
|
|
5289
|
-
args: [{ selector: 'sme-data-table', template: "<div role=\"presentation\" class=\"sme-table-header sme-focus-zone sme-data-table-transition\" #header\r\n [class.sme-shadow-scrolled-content]=\"isScrolledDown\" [class.sme-table-multi-select]=\"selectionMode==='multiple'\"\r\n [class.sme-table-selectable]=\"selectable\" [class.sme-table-indented]=\"!noLeftMargin\"\r\n [class.sme-table-select-all-enabled]=\"selectionMode==='multiple' && showAllItemCheckbox\">\r\n <!-- According to the accessibility team, data-table headers should be accessible by keyboard\r\n and the resizer should also be accessed by keyboard.-->\r\n <div #headerTable class=\"sme-table sme-table-virtualized sme-table-auto-width-phone-down\" role=\"rowgroup\">\r\n <div class=\"sme-table-row sme-arrange-stack-h sme-position-flex-auto\" role=\"row\"\r\n (keydown)=\"onHeaderTablePressed($event)\">\r\n <div class=\"sme-table-caption\" [attr.role]=\"selectionMode==='multiple'?'columnheader':'presentation'\"\r\n data-uta-id=\"checkboxColumn\">\r\n <div class=\"sme-table-checkbox sme-table-header-checkbox\"\r\n *ngIf=\"selectionMode==='multiple' && showAllItemCheckbox && showHeader\" role=\"presentation\">\r\n <input sme-lint-disable-self type=\"checkbox\" [attr.aria-label]=\"getAllItemCheckBoxAriaLabel()\"\r\n [checked]=\"shouldAllItemCheckBoxChecked()\"\r\n [attr.aria-checked]=\"shouldAllItemCheckBoxChecked()?'true':'false'\" (change)=\"onAllItemCheckBoxClicked()\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex = index\" [attr.field]=\"column.field\"\r\n [ngStyle]=\"{'width': column.width}\"\r\n class=\"sme-table-caption sme-table-column-header sme-position-flex-auto {{column.styleClass}}\"\r\n role=\"presentation\" [attr.data-uta-id]=\"column.utaId\" [attr.column-index]=\"colIndex\">\r\n <div *ngIf=\"column.sortable && column.sortable!='false' && showHeader\"\r\n class=\"sme-table-header-cell sme-focus-zone\" (click)=\"clickColumn(column)\" role=\"columnheader\"\r\n [title]=\"column.header\" aria-live=\"polite\" tabindex=\"0\" [attr.aria-sort]=\"columnSortSettings[column.header]\">\r\n <span>{{column.header}}</span>\r\n <span class=\"sme-icon sme-margin-left-xxs\" [attr.aria-label]=\"column.sortable ? getSortLabel(column) : null\"\r\n [ngClass]=\"{'sme-icon-up':column.sortMode===sortModeEnum.Ascend,'sme-icon-down':column.sortMode===sortModeEnum.Descend}\"></span>\r\n </div>\r\n <div *ngIf=\"!(column.sortable && column.sortable!='false') && showHeader\" class=\"sme-table-header-cell sme-focus-zone\"\r\n role=\"columnheader\" [title]=\"column.header\" tabindex=\"0\">\r\n <span>{{column.header}}</span>\r\n <span class=\"sme-icon sme-margin-left-xxs\" [attr.aria-label]=\"column.sortable ? getSortLabel(column) : null\"\r\n [ngClass]=\"{'sme-icon-up':column.sortMode===sortModeEnum.Ascend,'sme-icon-down':column.sortMode===sortModeEnum.Descend}\"></span>\r\n </div>\r\n <div *ngIf=\"!showHeader\" class=\"sme-table-header-cell\" role=\"columnheader\">\r\n </div>\r\n <sme-resizer [focusable]=\"false\" *ngIf=\"colIndex!==actualColumns.length-1 && showHeader\"\r\n resizerHostSelector=\"div.sme-table-header\" (resized)=\"onColumnResized(colIndex, $event)\"\r\n [visibleToScreenReader]=\"true\" [showResizerCover]=\"false\" orientation=\"left\"\r\n (resizing)=\"onColumnResizing($event)\" class=\"sme-focus-zone\"></sme-resizer>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"sme-focus-zone sme-table-container sme-data-table-transition\" #content role=\"presentation\"\r\n [class.sme-table-multi-select]=\"selectionMode==='multiple'\" [class.sme-table-selectable]=\"selectable\"\r\n [class.sme-margin-top-none]=\"!showHeader\" [class.sme-table-indented]=\"!noLeftMargin\"\r\n [class.sme-table-grid-lines]=\"showGrid\"\r\n [class.sme-table-select-all-enabled]=\"selectionMode==='multiple' && showAllItemCheckbox\"\r\n [class.sme-table-editable]=\"editable\">\r\n <div class=\"sme-table-scroll-container sme-layout-absolute sme-position-inset-none\"\r\n [ngClass]=\"{'sme-layout-absolute sme-position-inset-none': scrollable, 'sme-scrollable': shouldScroll}\"\r\n #scrollContainer role=\"rowgroup\">\r\n <div role=\"row\" class=\"sme-table-row sme-table-row-placeholder\" #emptyMessage tabindex=\"0\"\r\n *ngIf=\"showNoRecordsMessage()\" data-uta-id=\"empty-table-message\">\r\n <sme-loading-wheel *ngIf=\"isLoading || !isColumnWidthCalculated\" [message]=\"loadingMessage\">\r\n </sme-loading-wheel>\r\n <div class=\"sme-table-cell sme-table-cell-placeholder\"> </div>\r\n <div role=\"gridcell\" class=\"sme-table-cell\">{{getNoRecordsMessage()}}</div>\r\n </div>\r\n <div class=\"sme-layout-relative sme-position-stretch-h sme-arrange-overflow-hide\" #scrollBody role=\"presentation\">\r\n <div class=\"sme-table sme-table-scrollable sme-table-virtualized\" #scrollAboveData\r\n [ngStyle]=\"{top: scrollAboveDataStyleTop}\" [attr.aria-hidden]=\"true\" sme-lint-disable>\r\n <!-- Above view port -->\r\n <div *ngFor=\"let renderedItem of renderedItemsAboveViewPort; let rowIndex = index\"\r\n class=\"sme-table-row sme-table-row-data sme-table-row-selectable\"\r\n [class.sme-table-row-active]=\"renderedItem.index === getActiveRenderedItemIndex()\"\r\n [class.sme-table-row-selected]=\"renderedItem.index === getActiveRenderedItemIndex() || isItemSelected(renderedItem)\"\r\n [class.sme-table-group-item]=\"renderedItem.type === renderedItemTypeEnum.GroupItem\"\r\n [class.sme-table-group-header]=\"renderedItem.type === renderedItemTypeEnum.GroupHeader\"\r\n [class.sme-checked]=\"isItemSelected(renderedItem)\">\r\n <div class=\"sme-arrange-stack-h\">\r\n <div class=\"sme-table-td sme-position-flex-auto\">\r\n <div class=\"sme-table-cell\">\r\n <div *ngIf=\"!showAsTree\" class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [checked]=\"isItemSelected(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex=index\"\r\n [ngClass]=\"{'sme-table-column-first': isFirstDataColumn(column), 'sme-table-group-header-cell': renderedItem.type===renderedItemTypeEnum.GroupHeader}\"\r\n [ngStyle]=\"{'width':column.domWidth+'px'}\"\r\n class=\"sme-table-td sme-position-flex-auto {{column.styleClass}}\"\r\n [attr.tabindex]=\"isTreeTableParentNode(renderedItem) ? -1 : 0\">\r\n <div class=\"sme-screen-reader sme-screen-reader-disable-copy\" *ngIf=\"isFirstDataColumn(column)\">\r\n {{getAdditionalScreenRecorderContent(renderedItem)}}</div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.GroupHeader && colIndex===0\" class=\"sme-table-cell\"\r\n (click)=\"clickGroupToggle(renderedItem)\">\r\n <span *ngIf=\"useGroupToggle\" class=\"sme-icon sme-icon-size-xxs sme-margin-right-xxs\"\r\n [ngClass]=\"{'sme-icon-chevronDown':isGroupExpanded(renderedItem.data), 'sme-icon-chevronRight':!isGroupExpanded(renderedItem.data)}\">\r\n </span>\r\n <span *ngIf=\"!this.groupHeaderTemplate\">\r\n {{renderedItem.data}}\r\n </span>\r\n <span *ngIf=\"this.groupHeaderTemplate\">\r\n <sme-data-table-template-loader [template]=\"this.groupHeaderTemplate\" [data]=\"renderedItem.data\">\r\n </sme-data-table-template-loader>\r\n </span>\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && !renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\"\r\n [ngClass]=\"{'sme-expandable': renderedItem.hasChildren && !renderedItem.node.isLeaf}\">\r\n <span class=\"sme-icon sme-icon-size-xxs\" role=\"button\"\r\n [attr.aria-expanded]=\"renderedItem.node.expanded?'true':'false'\"\r\n (click)=\"clickTreeToggle($event, renderedItem)\"\r\n [ngClass]=\"{'sme-icon-chevronDown':renderedItem.node.expanded, 'sme-icon-chevronRight':!renderedItem.node.expanded}\"\r\n [attr.aria-label]=\"renderedItem.node.expanded ? this.strings.MsftSmeShell.Angular.DataTable.aria.label.collapse : this.strings.MsftSmeShell.Angular.DataTable.aria.label.expand\">\r\n </span>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\">\r\n <sme-loading-wheel size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\">\r\n </sme-loading-wheel>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div\r\n *ngIf=\"showAsTree && selectionMode==='multiple' && renderedItem.type==renderedItemTypeEnum.TreeNode && colIndex==0\"\r\n class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [checked]=\"isItemSelected(renderedItem)\"\r\n (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"!editable\">\r\n <div *ngIf=\"!column.bodyTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-full-height]=\"autoRowHeight\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data,column.field):'.'}}\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyTemplate\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\" [class.sme-table-cell-height-auto]=\"autoRowHeight\"\r\n class=\"sme-table-cell\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyTemplate\" [data]=\"renderedItem.data\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sme-table sme-table-scrollable\" #scrollData [class.sme-table-virtualized]=\"!disableUIVirtualization\"\r\n [ngStyle]=\"{top: scrollDataStyleTop}\" sme-lint-disable role=\"presentation\">\r\n <div *ngFor=\"let renderedItem of renderedItemsInAndBelowViewPort; let rowIndex = index\"\r\n (keydown)=\"onContentTablePressed($event)\" (keyup)=\"onContentTableKeyUp($event)\"\r\n (contextmenu)=\"enableRightClickSelect ? selectItem($event, renderedItem) : true\"\r\n (click)=\"selectItem($event, renderedItem)\" class=\"sme-table-row sme-table-row-data sme-table-row-selectable\"\r\n [class.sme-table-row-active]=\"renderedItem.index === getActiveRenderedItemIndex()\"\r\n [class.sme-table-row-selected]=\"rowDisplayAsSelected(renderedItem)\"\r\n [class.sme-table-group-item]=\"renderedItem.type === renderedItemTypeEnum.GroupItem\"\r\n [class.sme-table-group-header]=\"renderedItem.type === renderedItemTypeEnum.GroupHeader\"\r\n [class.sme-checked]=\"isItemSelected(renderedItem)\" [class.sme-table-row-editable]=\"editable\"\r\n [class.sme-has-validation-error]=\"hasValidationError(renderedItem)\"\r\n [class.sme-data-table-row-new-item]=\"renderedItem?.data?.isNewRow\"\r\n [attr.tabindex]=\"renderedItem.index >= 0 ? 0 : undefined\" (dblclick)=\"doubleClickRow($event,renderedItem)\"\r\n (focus)=\"onContentItemFocused($event, renderedItem)\" (focusin)=\"onContentItemFocused($event, renderedItem)\"\r\n (focusout)=\"onContentItemBlurred($event, renderedItem)\" [attr.data-rendered-item-index]=\"renderedItem.index\"\r\n [attr.aria-rowindex]=\"renderedItem.index+2\" [attr.aria-selected]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n (mouseenter)=\"setHoveredRenderedItem(renderedItem)\" (mouseleave)=\"unsetHoveredRenderedItem(renderedItem)\"\r\n role=\"row\" [attr.aria-expanded]=\"getAriaExpandedAttributeValue(renderedItem)\"\r\n [attr.aria-level]=\"showAsTree && renderedItem.depth ? (renderedItem.depth+1):undefined\">\r\n <div class=\"sme-arrange-stack-h\" role=\"presentation\">\r\n <div class=\"sme-table-td sme-position-flex-auto\"\r\n [attr.role] = \"selectionMode === 'multiple' ? 'gridcell': 'presentation'\">\r\n <div *ngIf=\"!showAsTree\" class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [attr.aria-checked]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n [attr.aria-labelledby]=\"idBag.firstDataColumn + renderedItem.index\"\r\n [checked]=\"isItemSelected(renderedItem)\" (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex=index\"\r\n [ngClass]=\"{'sme-table-column-first': isFirstDataColumn(column), 'sme-table-group-header-cell': renderedItem.type===renderedItemTypeEnum.GroupHeader}\"\r\n [ngStyle]=\"{'width':column.domWidth+'px'}\"\r\n class=\"sme-table-td sme-position-flex-auto {{column.styleClass}}\"\r\n role=\"gridcell\" [attr.aria-rowindex]=\"renderedItem.index+2\"\r\n [attr.tabindex]=\"isTreeTableParentNode(renderedItem) ? -1 : 0\">\r\n <div class=\"sme-screen-reader sme-screen-reader-disable-copy\" *ngIf=\"isFirstDataColumn(column)\">\r\n {{getAdditionalScreenRecorderContent(renderedItem)}}</div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.GroupHeader && colIndex===0\" class=\"sme-table-cell\"\r\n (click)=\"clickGroupToggle(renderedItem)\" [id]=\"getFirstColumnId(column, renderedItem)\">\r\n <span *ngIf=\"useGroupToggle\" class=\"sme-icon sme-icon-size-xxs sme-margin-right-xxs\"\r\n [ngClass]=\"{'sme-icon-chevronDown':isGroupExpanded(renderedItem.data), 'sme-icon-chevronRight':!isGroupExpanded(renderedItem.data)}\">\r\n </span>\r\n <span *ngIf=\"!this.groupHeaderTemplate\">\r\n {{renderedItem.data}}\r\n </span>\r\n <span *ngIf=\"this.groupHeaderTemplate\">\r\n <sme-data-table-template-loader [template]=\"this.groupHeaderTemplate\" [data]=\"renderedItem.data\">\r\n </sme-data-table-template-loader>\r\n </span>\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && !renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\"\r\n [ngClass]=\"{'sme-expandable': renderedItem.hasChildren && !renderedItem.node.isLeaf}\">\r\n <span class=\"sme-icon sme-icon-size-xxs\" role=\"button\"\r\n [attr.aria-expanded]=\"renderedItem.node.expanded?'true':'false'\"\r\n (click)=\"clickTreeToggle($event, renderedItem)\"\r\n [ngClass]=\"{'sme-icon-chevronDown':renderedItem.node.expanded, 'sme-icon-chevronRight':!renderedItem.node.expanded}\"\r\n [attr.aria-label]=\"renderedItem.node.expanded ? this.strings.MsftSmeShell.Angular.DataTable.aria.label.collapse : this.strings.MsftSmeShell.Angular.DataTable.aria.label.expand\">\r\n </span>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\">\r\n <sme-loading-wheel size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\">\r\n </sme-loading-wheel>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div\r\n *ngIf=\"showAsTree && selectionMode==='multiple' && renderedItem.type==renderedItemTypeEnum.TreeNode && colIndex==0\"\r\n class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [attr.aria-checked]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n [attr.aria-labelledby]=\"idBag.firstDataColumn + renderedItem.index\"\r\n [checked]=\"isItemSelected(renderedItem)\" (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"!editable\">\r\n <div *ngIf=\"!column.bodyTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-full-height]=\"autoRowHeight\"\r\n [id]=\"getFirstColumnId(column, renderedItem)\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyTemplate\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-height-auto]=\"autoRowHeight\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\" [id]=\"getFirstColumnId(column, renderedItem)\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyTemplate\" [data]=\"renderedItem.data\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"editable && !column.bodyEditTemplate\">\r\n <div *ngIf=\"!column.bodyReadTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data.content,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyReadTemplate\"\r\n class=\"sme-table-cell\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\" [renderedItem]=\"renderedItem\"\r\n [template]=\"column.bodyReadTemplate\" [data]=\"renderedItem.data.content\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"editable && column.bodyEditTemplate\">\r\n <ng-container *ngIf=\"!shouldShowEditRow(renderedItem)\">\r\n <div *ngIf=\"!column.bodyReadTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data.content,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyReadTemplate\"\r\n class=\"sme-table-cell\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyReadTemplate\" [data]=\"renderedItem.data.content\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"shouldShowEditRow(renderedItem)\" class=\"sme-table-cell sme-table-edit-container\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyEditTemplate\" [field]=\"column.field\" [data]=\"renderedItem.data.content\"\r\n [rowIndex]=\"rowIndex\" [renderedItem]=\"renderedItem\"\r\n (validationAlert)=\"onValidationAlertHandler(renderedItem, column.field, $event.alert)\"\r\n (dataChanged)=\"onEditableDataChanged($event.renderedItem,$event.field)\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasValidationError(renderedItem)\" class=\"sme-table-row-validation\">\r\n <div class=\"sme-table-td sme-position-flex-auto\"\r\n [attr.role] = \"selectionMode === 'multiple' ? 'gridcell' : 'presentation'\"\r\n [attr.tabindex]=\"selectionMode==='multiple'?'0':'undefined'\">\r\n <div class=\"sme-table-cell\" role=\"presentation\">\r\n <div *ngFor=\"let validationResultItem of renderedItem.validationResult\">\r\n <sme-validation-alert [alert]=\"validationResultItem.alert\"></sme-validation-alert>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sme-table-row\" #tempRow>\r\n <div class=\"sme-table-td\" tabindex=\"0\">\r\n <div class=\"sme-table-cell\"> </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"shouldUseLastFocusableShadowElement\" #lastFocusableShadowElement class=\"sme-focus-zone\"\r\n data-sme-last-focusable-shadow-element (focus)=\"onLastFocusableShadowElementFocused($event)\" tabindex=\"0\"></div>\r\n </div>\r\n <div class=\"sme-layout-absolute sme-position-inset-none\"\r\n *ngIf=\"isBusy || (this.nodeNavigatingTask && this.nodeNavigatingTask.isRunning)\">\r\n <sme-loading-wheel [isBackgroundTransparent]=\"true\"></sme-loading-wheel>\r\n </div>\r\n</div>\r\n<div #resizerIndicator\r\n class=\"sme-width-xxs sme-layout-absolute sme-position-stretch-v sme-background-color-base-80 sme-layer-flyout sme-layout-none\">\r\n</div>\r\n" }]
|
|
5287
|
+
args: [{ selector: 'sme-data-table', template: "<div role=\"presentation\" class=\"sme-table-header sme-focus-zone sme-data-table-transition\" #header\r\n [class.sme-shadow-scrolled-content]=\"isScrolledDown\" [class.sme-table-multi-select]=\"selectionMode==='multiple'\"\r\n [class.sme-table-selectable]=\"selectable\" [class.sme-table-indented]=\"!noLeftMargin\"\r\n [class.sme-table-select-all-enabled]=\"selectionMode==='multiple' && showAllItemCheckbox\">\r\n <!-- According to the accessibility team, data-table headers should be accessible by keyboard\r\n and the resizer should also be accessed by keyboard.-->\r\n <div #headerTable class=\"sme-table sme-table-virtualized sme-table-auto-width-phone-down\" role=\"rowgroup\">\r\n <div class=\"sme-table-row sme-arrange-stack-h sme-position-flex-auto\" role=\"row\"\r\n (keydown)=\"onHeaderTablePressed($event)\">\r\n <div class=\"sme-table-caption\" [attr.role]=\"selectionMode==='multiple'?'columnheader':'presentation'\"\r\n data-uta-id=\"checkboxColumn\">\r\n <div class=\"sme-table-checkbox sme-table-header-checkbox\"\r\n *ngIf=\"selectionMode==='multiple' && showAllItemCheckbox && showHeader\" role=\"presentation\">\r\n <input sme-lint-disable-self type=\"checkbox\" [attr.aria-label]=\"getAllItemCheckBoxAriaLabel()\"\r\n [checked]=\"shouldAllItemCheckBoxChecked()\"\r\n [attr.aria-checked]=\"shouldAllItemCheckBoxChecked()?'true':'false'\" (change)=\"onAllItemCheckBoxClicked()\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex = index\" [attr.field]=\"column.field\"\r\n [ngStyle]=\"{'width': column.width}\"\r\n class=\"sme-table-caption sme-table-column-header sme-position-flex-auto {{column.styleClass}}\"\r\n role=\"presentation\" [attr.data-uta-id]=\"column.utaId\" [attr.column-index]=\"colIndex\">\r\n <div *ngIf=\"column.sortable && column.sortable!='false' && showHeader\"\r\n class=\"sme-table-header-cell sme-focus-zone\" (click)=\"clickColumn(column)\" role=\"columnheader\"\r\n [title]=\"column.header\" aria-live=\"polite\" tabindex=\"0\" [attr.aria-sort]=\"columnSortSettings[column.header]\"\r\n [attr.aria-label]=\"column.sortable ? getSortLabel(column) : null\">\r\n <span>{{column.header}}</span>\r\n <span class=\"sme-icon sme-margin-left-xxs\"\r\n [ngClass]=\"{'sme-icon-up':column.sortMode===sortModeEnum.Ascend,'sme-icon-down':column.sortMode===sortModeEnum.Descend}\">\r\n </span>\r\n </div>\r\n <div *ngIf=\"!(column.sortable && column.sortable!='false') && showHeader\"\r\n class=\"sme-table-header-cell sme-focus-zone\" role=\"columnheader\" [title]=\"column.header\" tabindex=\"0\"\r\n [attr.aria-label]=\"column.sortable ? getSortLabel(column) : null\">\r\n <span>{{column.header}}</span>\r\n <span class=\"sme-icon sme-margin-left-xxs\"\r\n [ngClass]=\"{'sme-icon-up':column.sortMode===sortModeEnum.Ascend,'sme-icon-down':column.sortMode===sortModeEnum.Descend}\"></span>\r\n </div>\r\n <div *ngIf=\"!showHeader\" class=\"sme-table-header-cell\" role=\"columnheader\">\r\n </div>\r\n <sme-resizer [focusable]=\"false\" *ngIf=\"colIndex!==actualColumns.length-1 && showHeader\"\r\n resizerHostSelector=\"div.sme-table-header\" (resized)=\"onColumnResized(colIndex, $event)\"\r\n [visibleToScreenReader]=\"true\" [showResizerCover]=\"false\" orientation=\"left\"\r\n (resizing)=\"onColumnResizing($event)\" class=\"sme-focus-zone\"></sme-resizer>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"sme-focus-zone sme-table-container sme-data-table-transition\" #content role=\"presentation\"\r\n [class.sme-table-multi-select]=\"selectionMode==='multiple'\" [class.sme-table-selectable]=\"selectable\"\r\n [class.sme-margin-top-none]=\"!showHeader\" [class.sme-table-indented]=\"!noLeftMargin\"\r\n [class.sme-table-grid-lines]=\"showGrid\"\r\n [class.sme-table-select-all-enabled]=\"selectionMode==='multiple' && showAllItemCheckbox\"\r\n [class.sme-table-editable]=\"editable\">\r\n <div class=\"sme-table-scroll-container sme-layout-absolute sme-position-inset-none\"\r\n [ngClass]=\"{'sme-layout-absolute sme-position-inset-none': scrollable, 'sme-scrollable': shouldScroll}\"\r\n #scrollContainer role=\"rowgroup\">\r\n <div role=\"row\" class=\"sme-table-row sme-table-row-placeholder\" #emptyMessage tabindex=\"0\"\r\n *ngIf=\"showNoRecordsMessage()\" data-uta-id=\"empty-table-message\">\r\n <sme-loading-wheel *ngIf=\"isLoading || !isColumnWidthCalculated\" [message]=\"loadingMessage\">\r\n </sme-loading-wheel>\r\n <div class=\"sme-table-cell sme-table-cell-placeholder\"> </div>\r\n <div role=\"gridcell\" class=\"sme-table-cell\">{{getNoRecordsMessage()}}</div>\r\n </div>\r\n <div class=\"sme-layout-relative sme-position-stretch-h sme-arrange-overflow-hide\" #scrollBody role=\"presentation\">\r\n <div class=\"sme-table sme-table-scrollable sme-table-virtualized\" #scrollAboveData\r\n [ngStyle]=\"{top: scrollAboveDataStyleTop}\" [attr.aria-hidden]=\"true\" sme-lint-disable>\r\n <!-- Above view port -->\r\n <div *ngFor=\"let renderedItem of renderedItemsAboveViewPort; let rowIndex = index\"\r\n class=\"sme-table-row sme-table-row-data sme-table-row-selectable\"\r\n [class.sme-table-row-active]=\"renderedItem.index === getActiveRenderedItemIndex()\"\r\n [class.sme-table-row-selected]=\"renderedItem.index === getActiveRenderedItemIndex() || isItemSelected(renderedItem)\"\r\n [class.sme-table-group-item]=\"renderedItem.type === renderedItemTypeEnum.GroupItem\"\r\n [class.sme-table-group-header]=\"renderedItem.type === renderedItemTypeEnum.GroupHeader\"\r\n [class.sme-checked]=\"isItemSelected(renderedItem)\">\r\n <div class=\"sme-arrange-stack-h\">\r\n <div class=\"sme-table-td sme-position-flex-auto\">\r\n <div class=\"sme-table-cell\">\r\n <div *ngIf=\"!showAsTree\" class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [checked]=\"isItemSelected(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex=index\"\r\n [ngClass]=\"{'sme-table-column-first': isFirstDataColumn(column), 'sme-table-group-header-cell': renderedItem.type===renderedItemTypeEnum.GroupHeader}\"\r\n [ngStyle]=\"{'width':column.domWidth+'px'}\"\r\n class=\"sme-table-td sme-position-flex-auto {{column.styleClass}}\"\r\n [attr.tabindex]=\"isTreeTableParentNode(renderedItem) ? -1 : 0\">\r\n <div class=\"sme-screen-reader sme-screen-reader-disable-copy\" *ngIf=\"isFirstDataColumn(column)\">\r\n {{getAdditionalScreenRecorderContent(renderedItem)}}</div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.GroupHeader && colIndex===0\" class=\"sme-table-cell\"\r\n (click)=\"clickGroupToggle(renderedItem)\">\r\n <span *ngIf=\"useGroupToggle\" class=\"sme-icon sme-icon-size-xxs sme-margin-right-xxs\"\r\n [ngClass]=\"{'sme-icon-chevronDown':isGroupExpanded(renderedItem.data), 'sme-icon-chevronRight':!isGroupExpanded(renderedItem.data)}\">\r\n </span>\r\n <span *ngIf=\"!this.groupHeaderTemplate\">\r\n {{renderedItem.data}}\r\n </span>\r\n <span *ngIf=\"this.groupHeaderTemplate\">\r\n <sme-data-table-template-loader [template]=\"this.groupHeaderTemplate\" [data]=\"renderedItem.data\">\r\n </sme-data-table-template-loader>\r\n </span>\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && !renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\"\r\n [ngClass]=\"{'sme-expandable': renderedItem.hasChildren && !renderedItem.node.isLeaf}\">\r\n <span class=\"sme-icon sme-icon-size-xxs\" role=\"button\"\r\n [attr.aria-expanded]=\"renderedItem.node.expanded?'true':'false'\"\r\n (click)=\"clickTreeToggle($event, renderedItem)\"\r\n [ngClass]=\"{'sme-icon-chevronDown':renderedItem.node.expanded, 'sme-icon-chevronRight':!renderedItem.node.expanded}\"\r\n [attr.aria-label]=\"renderedItem.node.expanded ? this.strings.MsftSmeShell.Angular.DataTable.aria.label.collapse : this.strings.MsftSmeShell.Angular.DataTable.aria.label.expand\">\r\n </span>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\">\r\n <sme-loading-wheel size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\">\r\n </sme-loading-wheel>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div\r\n *ngIf=\"showAsTree && selectionMode==='multiple' && renderedItem.type==renderedItemTypeEnum.TreeNode && colIndex==0\"\r\n class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [checked]=\"isItemSelected(renderedItem)\"\r\n (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"!editable\">\r\n <div *ngIf=\"!column.bodyTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-full-height]=\"autoRowHeight\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data,column.field):'.'}}\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyTemplate\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\" [class.sme-table-cell-height-auto]=\"autoRowHeight\"\r\n class=\"sme-table-cell\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyTemplate\" [data]=\"renderedItem.data\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sme-table sme-table-scrollable\" #scrollData [class.sme-table-virtualized]=\"!disableUIVirtualization\"\r\n [ngStyle]=\"{top: scrollDataStyleTop}\" sme-lint-disable role=\"presentation\">\r\n <div *ngFor=\"let renderedItem of renderedItemsInAndBelowViewPort; let rowIndex = index\"\r\n (keydown)=\"onContentTablePressed($event)\" (keyup)=\"onContentTableKeyUp($event)\"\r\n (contextmenu)=\"enableRightClickSelect ? selectItem($event, renderedItem) : true\"\r\n (click)=\"selectItem($event, renderedItem)\" class=\"sme-table-row sme-table-row-data sme-table-row-selectable\"\r\n [class.sme-table-row-active]=\"renderedItem.index === getActiveRenderedItemIndex()\"\r\n [class.sme-table-row-selected]=\"rowDisplayAsSelected(renderedItem)\"\r\n [class.sme-table-group-item]=\"renderedItem.type === renderedItemTypeEnum.GroupItem\"\r\n [class.sme-table-group-header]=\"renderedItem.type === renderedItemTypeEnum.GroupHeader\"\r\n [class.sme-checked]=\"isItemSelected(renderedItem)\" [class.sme-table-row-editable]=\"editable\"\r\n [class.sme-has-validation-error]=\"hasValidationError(renderedItem)\"\r\n [class.sme-data-table-row-new-item]=\"renderedItem?.data?.isNewRow\"\r\n [attr.tabindex]=\"renderedItem.index >= 0 ? 0 : undefined\" (dblclick)=\"doubleClickRow($event,renderedItem)\"\r\n (focus)=\"onContentItemFocused($event, renderedItem)\" (focusin)=\"onContentItemFocused($event, renderedItem)\"\r\n (focusout)=\"onContentItemBlurred($event, renderedItem)\" [attr.data-rendered-item-index]=\"renderedItem.index\"\r\n [attr.aria-rowindex]=\"renderedItem.index+2\" [attr.aria-selected]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n (mouseenter)=\"setHoveredRenderedItem(renderedItem)\" (mouseleave)=\"unsetHoveredRenderedItem(renderedItem)\"\r\n role=\"row\" [attr.aria-expanded]=\"getAriaExpandedAttributeValue(renderedItem)\"\r\n [attr.aria-level]=\"showAsTree && renderedItem.depth ? (renderedItem.depth+1):undefined\">\r\n <div class=\"sme-arrange-stack-h\" role=\"presentation\">\r\n <div class=\"sme-table-td sme-position-flex-auto\"\r\n [attr.role]=\"selectionMode === 'multiple' ? 'gridcell': 'presentation'\">\r\n <div *ngIf=\"!showAsTree\" class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [attr.aria-checked]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n [attr.aria-labelledby]=\"idBag.firstDataColumn + renderedItem.index\"\r\n [checked]=\"isItemSelected(renderedItem)\" (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex=index\"\r\n [ngClass]=\"{'sme-table-column-first': isFirstDataColumn(column), 'sme-table-group-header-cell': renderedItem.type===renderedItemTypeEnum.GroupHeader}\"\r\n [ngStyle]=\"{'width':column.domWidth+'px'}\"\r\n class=\"sme-table-td sme-position-flex-auto {{column.styleClass}}\" role=\"gridcell\"\r\n [attr.aria-rowindex]=\"renderedItem.index+2\"\r\n [attr.tabindex]=\"isTreeTableParentNode(renderedItem) ? -1 : 0\">\r\n <div class=\"sme-screen-reader sme-screen-reader-disable-copy\" *ngIf=\"isFirstDataColumn(column)\">\r\n {{getAdditionalScreenRecorderContent(renderedItem)}}</div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.GroupHeader && colIndex===0\" class=\"sme-table-cell\"\r\n (click)=\"clickGroupToggle(renderedItem)\" [id]=\"getFirstColumnId(column, renderedItem)\">\r\n <span *ngIf=\"useGroupToggle\" class=\"sme-icon sme-icon-size-xxs sme-margin-right-xxs\"\r\n [ngClass]=\"{'sme-icon-chevronDown':isGroupExpanded(renderedItem.data), 'sme-icon-chevronRight':!isGroupExpanded(renderedItem.data)}\">\r\n </span>\r\n <span *ngIf=\"!this.groupHeaderTemplate\">\r\n {{renderedItem.data}}\r\n </span>\r\n <span *ngIf=\"this.groupHeaderTemplate\">\r\n <sme-data-table-template-loader [template]=\"this.groupHeaderTemplate\" [data]=\"renderedItem.data\">\r\n </sme-data-table-template-loader>\r\n </span>\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && !renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\"\r\n [ngClass]=\"{'sme-expandable': renderedItem.hasChildren && !renderedItem.node.isLeaf}\">\r\n <span class=\"sme-icon sme-icon-size-xxs\" role=\"button\"\r\n [attr.aria-expanded]=\"renderedItem.node.expanded?'true':'false'\"\r\n (click)=\"clickTreeToggle($event, renderedItem)\"\r\n [ngClass]=\"{'sme-icon-chevronDown':renderedItem.node.expanded, 'sme-icon-chevronRight':!renderedItem.node.expanded}\"\r\n [attr.aria-label]=\"renderedItem.node.expanded ? this.strings.MsftSmeShell.Angular.DataTable.aria.label.collapse : this.strings.MsftSmeShell.Angular.DataTable.aria.label.expand\">\r\n </span>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\">\r\n <sme-loading-wheel size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\">\r\n </sme-loading-wheel>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div\r\n *ngIf=\"showAsTree && selectionMode==='multiple' && renderedItem.type==renderedItemTypeEnum.TreeNode && colIndex==0\"\r\n class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [attr.aria-checked]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n [attr.aria-labelledby]=\"idBag.firstDataColumn + renderedItem.index\"\r\n [checked]=\"isItemSelected(renderedItem)\" (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"!editable\">\r\n <div *ngIf=\"!column.bodyTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-full-height]=\"autoRowHeight\"\r\n [id]=\"getFirstColumnId(column, renderedItem)\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyTemplate\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-height-auto]=\"autoRowHeight\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\" [id]=\"getFirstColumnId(column, renderedItem)\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyTemplate\" [data]=\"renderedItem.data\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"editable && !column.bodyEditTemplate\">\r\n <div *ngIf=\"!column.bodyReadTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data.content,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyReadTemplate\"\r\n class=\"sme-table-cell\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\" [renderedItem]=\"renderedItem\"\r\n [template]=\"column.bodyReadTemplate\" [data]=\"renderedItem.data.content\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"editable && column.bodyEditTemplate\">\r\n <ng-container *ngIf=\"!shouldShowEditRow(renderedItem)\">\r\n <div *ngIf=\"!column.bodyReadTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data.content,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyReadTemplate\"\r\n class=\"sme-table-cell\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyReadTemplate\" [data]=\"renderedItem.data.content\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"shouldShowEditRow(renderedItem)\" class=\"sme-table-cell sme-table-edit-container\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyEditTemplate\" [field]=\"column.field\" [data]=\"renderedItem.data.content\"\r\n [rowIndex]=\"rowIndex\" [renderedItem]=\"renderedItem\"\r\n (validationAlert)=\"onValidationAlertHandler(renderedItem, column.field, $event.alert)\"\r\n (dataChanged)=\"onEditableDataChanged($event.renderedItem,$event.field)\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasValidationError(renderedItem)\" class=\"sme-table-row-validation\">\r\n <div class=\"sme-table-td sme-position-flex-auto\"\r\n [attr.role]=\"selectionMode === 'multiple' ? 'gridcell' : 'presentation'\"\r\n [attr.tabindex]=\"selectionMode==='multiple'?'0':'undefined'\">\r\n <div class=\"sme-table-cell\" role=\"presentation\">\r\n <div *ngFor=\"let validationResultItem of renderedItem.validationResult\">\r\n <sme-validation-alert [alert]=\"validationResultItem.alert\"></sme-validation-alert>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sme-table-row\" #tempRow>\r\n <div class=\"sme-table-td\" tabindex=\"0\">\r\n <div class=\"sme-table-cell\"> </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"shouldUseLastFocusableShadowElement\" #lastFocusableShadowElement class=\"sme-focus-zone\"\r\n data-sme-last-focusable-shadow-element (focus)=\"onLastFocusableShadowElementFocused($event)\" tabindex=\"0\"></div>\r\n </div>\r\n <div class=\"sme-layout-absolute sme-position-inset-none\"\r\n *ngIf=\"isBusy || (this.nodeNavigatingTask && this.nodeNavigatingTask.isRunning)\">\r\n <sme-loading-wheel [isBackgroundTransparent]=\"true\"></sme-loading-wheel>\r\n </div>\r\n</div>\r\n<div #resizerIndicator\r\n class=\"sme-width-xxs sme-layout-absolute sme-position-stretch-v sme-background-color-base-80 sme-layer-flyout sme-layout-none\">\r\n</div>\r\n" }]
|
|
5290
5288
|
}], function () { return [{ type: i0.Injector }]; }, { resizerIndicator: [{
|
|
5291
5289
|
type: ViewChild,
|
|
5292
5290
|
args: ['resizerIndicator']
|
|
@@ -5545,6 +5543,6 @@ export class TreeTableComponent extends DataTableComponent {
|
|
|
5545
5543
|
} }, dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i1.NgStyle, i2.ResizerComponent, i3.LoadingWheelComponent, i4.TooltipDirective, i5.ValidationAlertComponent, i6.DataTableTemplateLoaderComponent], encapsulation: 2 });
|
|
5546
5544
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TreeTableComponent, [{
|
|
5547
5545
|
type: Component,
|
|
5548
|
-
args: [{ selector: 'sme-tree-table', template: "<div role=\"presentation\" class=\"sme-table-header sme-focus-zone sme-data-table-transition\" #header\r\n [class.sme-shadow-scrolled-content]=\"isScrolledDown\" [class.sme-table-multi-select]=\"selectionMode==='multiple'\"\r\n [class.sme-table-selectable]=\"selectable\" [class.sme-table-indented]=\"!noLeftMargin\"\r\n [class.sme-table-select-all-enabled]=\"selectionMode==='multiple' && showAllItemCheckbox\">\r\n <!-- According to the accessibility team, data-table headers should be accessible by keyboard\r\n and the resizer should also be accessed by keyboard.-->\r\n <div #headerTable class=\"sme-table sme-table-virtualized sme-table-auto-width-phone-down\" role=\"rowgroup\">\r\n <div class=\"sme-table-row sme-arrange-stack-h sme-position-flex-auto\" role=\"row\"\r\n (keydown)=\"onHeaderTablePressed($event)\">\r\n <div class=\"sme-table-caption\" [attr.role]=\"selectionMode==='multiple'?'columnheader':'presentation'\"\r\n data-uta-id=\"checkboxColumn\">\r\n <div class=\"sme-table-checkbox sme-table-header-checkbox\"\r\n *ngIf=\"selectionMode==='multiple' && showAllItemCheckbox && showHeader\" role=\"presentation\">\r\n <input sme-lint-disable-self type=\"checkbox\" [attr.aria-label]=\"getAllItemCheckBoxAriaLabel()\"\r\n [checked]=\"shouldAllItemCheckBoxChecked()\"\r\n [attr.aria-checked]=\"shouldAllItemCheckBoxChecked()?'true':'false'\" (change)=\"onAllItemCheckBoxClicked()\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex = index\" [attr.field]=\"column.field\"\r\n [ngStyle]=\"{'width': column.width}\"\r\n class=\"sme-table-caption sme-table-column-header sme-position-flex-auto {{column.styleClass}}\"\r\n role=\"presentation\" [attr.data-uta-id]=\"column.utaId\" [attr.column-index]=\"colIndex\">\r\n <div *ngIf=\"column.sortable && column.sortable!='false' && showHeader\"\r\n class=\"sme-table-header-cell sme-focus-zone\" (click)=\"clickColumn(column)\" role=\"columnheader\"\r\n [title]=\"column.header\" aria-live=\"polite\" tabindex=\"0\" [attr.aria-sort]=\"columnSortSettings[column.header]\">\r\n <span>{{column.header}}</span>\r\n <span class=\"sme-icon sme-margin-left-xxs\" [attr.aria-label]=\"column.sortable ? getSortLabel(column) : null\"\r\n [ngClass]=\"{'sme-icon-up':column.sortMode===sortModeEnum.Ascend,'sme-icon-down':column.sortMode===sortModeEnum.Descend}\"></span>\r\n </div>\r\n <div *ngIf=\"!(column.sortable && column.sortable!='false') && showHeader\" class=\"sme-table-header-cell sme-focus-zone\"\r\n role=\"columnheader\" [title]=\"column.header\" tabindex=\"0\">\r\n <span>{{column.header}}</span>\r\n <span class=\"sme-icon sme-margin-left-xxs\" [attr.aria-label]=\"column.sortable ? getSortLabel(column) : null\"\r\n [ngClass]=\"{'sme-icon-up':column.sortMode===sortModeEnum.Ascend,'sme-icon-down':column.sortMode===sortModeEnum.Descend}\"></span>\r\n </div>\r\n <div *ngIf=\"!showHeader\" class=\"sme-table-header-cell\" role=\"columnheader\">\r\n </div>\r\n <sme-resizer [focusable]=\"false\" *ngIf=\"colIndex!==actualColumns.length-1 && showHeader\"\r\n resizerHostSelector=\"div.sme-table-header\" (resized)=\"onColumnResized(colIndex, $event)\"\r\n [visibleToScreenReader]=\"true\" [showResizerCover]=\"false\" orientation=\"left\"\r\n (resizing)=\"onColumnResizing($event)\" class=\"sme-focus-zone\"></sme-resizer>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"sme-focus-zone sme-table-container sme-data-table-transition\" #content role=\"presentation\"\r\n [class.sme-table-multi-select]=\"selectionMode==='multiple'\" [class.sme-table-selectable]=\"selectable\"\r\n [class.sme-margin-top-none]=\"!showHeader\" [class.sme-table-indented]=\"!noLeftMargin\"\r\n [class.sme-table-grid-lines]=\"showGrid\"\r\n [class.sme-table-select-all-enabled]=\"selectionMode==='multiple' && showAllItemCheckbox\"\r\n [class.sme-table-editable]=\"editable\">\r\n <div class=\"sme-table-scroll-container sme-layout-absolute sme-position-inset-none\"\r\n [ngClass]=\"{'sme-layout-absolute sme-position-inset-none': scrollable, 'sme-scrollable': shouldScroll}\"\r\n #scrollContainer role=\"rowgroup\">\r\n <div role=\"row\" class=\"sme-table-row sme-table-row-placeholder\" #emptyMessage tabindex=\"0\"\r\n *ngIf=\"showNoRecordsMessage()\" data-uta-id=\"empty-table-message\">\r\n <sme-loading-wheel *ngIf=\"isLoading || !isColumnWidthCalculated\" [message]=\"loadingMessage\">\r\n </sme-loading-wheel>\r\n <div class=\"sme-table-cell sme-table-cell-placeholder\"> </div>\r\n <div role=\"gridcell\" class=\"sme-table-cell\">{{getNoRecordsMessage()}}</div>\r\n </div>\r\n <div class=\"sme-layout-relative sme-position-stretch-h sme-arrange-overflow-hide\" #scrollBody role=\"presentation\">\r\n <div class=\"sme-table sme-table-scrollable sme-table-virtualized\" #scrollAboveData\r\n [ngStyle]=\"{top: scrollAboveDataStyleTop}\" [attr.aria-hidden]=\"true\" sme-lint-disable>\r\n <!-- Above view port -->\r\n <div *ngFor=\"let renderedItem of renderedItemsAboveViewPort; let rowIndex = index\"\r\n class=\"sme-table-row sme-table-row-data sme-table-row-selectable\"\r\n [class.sme-table-row-active]=\"renderedItem.index === getActiveRenderedItemIndex()\"\r\n [class.sme-table-row-selected]=\"renderedItem.index === getActiveRenderedItemIndex() || isItemSelected(renderedItem)\"\r\n [class.sme-table-group-item]=\"renderedItem.type === renderedItemTypeEnum.GroupItem\"\r\n [class.sme-table-group-header]=\"renderedItem.type === renderedItemTypeEnum.GroupHeader\"\r\n [class.sme-checked]=\"isItemSelected(renderedItem)\">\r\n <div class=\"sme-arrange-stack-h\">\r\n <div class=\"sme-table-td sme-position-flex-auto\">\r\n <div class=\"sme-table-cell\">\r\n <div *ngIf=\"!showAsTree\" class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [checked]=\"isItemSelected(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex=index\"\r\n [ngClass]=\"{'sme-table-column-first': isFirstDataColumn(column), 'sme-table-group-header-cell': renderedItem.type===renderedItemTypeEnum.GroupHeader}\"\r\n [ngStyle]=\"{'width':column.domWidth+'px'}\"\r\n class=\"sme-table-td sme-position-flex-auto {{column.styleClass}}\"\r\n [attr.tabindex]=\"isTreeTableParentNode(renderedItem) ? -1 : 0\">\r\n <div class=\"sme-screen-reader sme-screen-reader-disable-copy\" *ngIf=\"isFirstDataColumn(column)\">\r\n {{getAdditionalScreenRecorderContent(renderedItem)}}</div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.GroupHeader && colIndex===0\" class=\"sme-table-cell\"\r\n (click)=\"clickGroupToggle(renderedItem)\">\r\n <span *ngIf=\"useGroupToggle\" class=\"sme-icon sme-icon-size-xxs sme-margin-right-xxs\"\r\n [ngClass]=\"{'sme-icon-chevronDown':isGroupExpanded(renderedItem.data), 'sme-icon-chevronRight':!isGroupExpanded(renderedItem.data)}\">\r\n </span>\r\n <span *ngIf=\"!this.groupHeaderTemplate\">\r\n {{renderedItem.data}}\r\n </span>\r\n <span *ngIf=\"this.groupHeaderTemplate\">\r\n <sme-data-table-template-loader [template]=\"this.groupHeaderTemplate\" [data]=\"renderedItem.data\">\r\n </sme-data-table-template-loader>\r\n </span>\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && !renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\"\r\n [ngClass]=\"{'sme-expandable': renderedItem.hasChildren && !renderedItem.node.isLeaf}\">\r\n <span class=\"sme-icon sme-icon-size-xxs\" role=\"button\"\r\n [attr.aria-expanded]=\"renderedItem.node.expanded?'true':'false'\"\r\n (click)=\"clickTreeToggle($event, renderedItem)\"\r\n [ngClass]=\"{'sme-icon-chevronDown':renderedItem.node.expanded, 'sme-icon-chevronRight':!renderedItem.node.expanded}\"\r\n [attr.aria-label]=\"renderedItem.node.expanded ? this.strings.MsftSmeShell.Angular.DataTable.aria.label.collapse : this.strings.MsftSmeShell.Angular.DataTable.aria.label.expand\">\r\n </span>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\">\r\n <sme-loading-wheel size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\">\r\n </sme-loading-wheel>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div\r\n *ngIf=\"showAsTree && selectionMode==='multiple' && renderedItem.type==renderedItemTypeEnum.TreeNode && colIndex==0\"\r\n class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [checked]=\"isItemSelected(renderedItem)\"\r\n (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"!editable\">\r\n <div *ngIf=\"!column.bodyTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-full-height]=\"autoRowHeight\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data,column.field):'.'}}\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyTemplate\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\" [class.sme-table-cell-height-auto]=\"autoRowHeight\"\r\n class=\"sme-table-cell\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyTemplate\" [data]=\"renderedItem.data\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sme-table sme-table-scrollable\" #scrollData [class.sme-table-virtualized]=\"!disableUIVirtualization\"\r\n [ngStyle]=\"{top: scrollDataStyleTop}\" sme-lint-disable role=\"presentation\">\r\n <div *ngFor=\"let renderedItem of renderedItemsInAndBelowViewPort; let rowIndex = index\"\r\n (keydown)=\"onContentTablePressed($event)\" (keyup)=\"onContentTableKeyUp($event)\"\r\n (contextmenu)=\"enableRightClickSelect ? selectItem($event, renderedItem) : true\"\r\n (click)=\"selectItem($event, renderedItem)\" class=\"sme-table-row sme-table-row-data sme-table-row-selectable\"\r\n [class.sme-table-row-active]=\"renderedItem.index === getActiveRenderedItemIndex()\"\r\n [class.sme-table-row-selected]=\"rowDisplayAsSelected(renderedItem)\"\r\n [class.sme-table-group-item]=\"renderedItem.type === renderedItemTypeEnum.GroupItem\"\r\n [class.sme-table-group-header]=\"renderedItem.type === renderedItemTypeEnum.GroupHeader\"\r\n [class.sme-checked]=\"isItemSelected(renderedItem)\" [class.sme-table-row-editable]=\"editable\"\r\n [class.sme-has-validation-error]=\"hasValidationError(renderedItem)\"\r\n [class.sme-data-table-row-new-item]=\"renderedItem?.data?.isNewRow\"\r\n [attr.tabindex]=\"renderedItem.index >= 0 ? 0 : undefined\" (dblclick)=\"doubleClickRow($event,renderedItem)\"\r\n (focus)=\"onContentItemFocused($event, renderedItem)\" (focusin)=\"onContentItemFocused($event, renderedItem)\"\r\n (focusout)=\"onContentItemBlurred($event, renderedItem)\" [attr.data-rendered-item-index]=\"renderedItem.index\"\r\n [attr.aria-rowindex]=\"renderedItem.index+2\" [attr.aria-selected]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n (mouseenter)=\"setHoveredRenderedItem(renderedItem)\" (mouseleave)=\"unsetHoveredRenderedItem(renderedItem)\"\r\n role=\"row\" [attr.aria-expanded]=\"getAriaExpandedAttributeValue(renderedItem)\"\r\n [attr.aria-level]=\"showAsTree && renderedItem.depth ? (renderedItem.depth+1):undefined\">\r\n <div class=\"sme-arrange-stack-h\" role=\"presentation\">\r\n <div class=\"sme-table-td sme-position-flex-auto\"\r\n [attr.role] = \"selectionMode === 'multiple' ? 'gridcell': 'presentation'\">\r\n <div *ngIf=\"!showAsTree\" class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [attr.aria-checked]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n [attr.aria-labelledby]=\"idBag.firstDataColumn + renderedItem.index\"\r\n [checked]=\"isItemSelected(renderedItem)\" (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex=index\"\r\n [ngClass]=\"{'sme-table-column-first': isFirstDataColumn(column), 'sme-table-group-header-cell': renderedItem.type===renderedItemTypeEnum.GroupHeader}\"\r\n [ngStyle]=\"{'width':column.domWidth+'px'}\"\r\n class=\"sme-table-td sme-position-flex-auto {{column.styleClass}}\"\r\n role=\"gridcell\" [attr.aria-rowindex]=\"renderedItem.index+2\"\r\n [attr.tabindex]=\"isTreeTableParentNode(renderedItem) ? -1 : 0\">\r\n <div class=\"sme-screen-reader sme-screen-reader-disable-copy\" *ngIf=\"isFirstDataColumn(column)\">\r\n {{getAdditionalScreenRecorderContent(renderedItem)}}</div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.GroupHeader && colIndex===0\" class=\"sme-table-cell\"\r\n (click)=\"clickGroupToggle(renderedItem)\" [id]=\"getFirstColumnId(column, renderedItem)\">\r\n <span *ngIf=\"useGroupToggle\" class=\"sme-icon sme-icon-size-xxs sme-margin-right-xxs\"\r\n [ngClass]=\"{'sme-icon-chevronDown':isGroupExpanded(renderedItem.data), 'sme-icon-chevronRight':!isGroupExpanded(renderedItem.data)}\">\r\n </span>\r\n <span *ngIf=\"!this.groupHeaderTemplate\">\r\n {{renderedItem.data}}\r\n </span>\r\n <span *ngIf=\"this.groupHeaderTemplate\">\r\n <sme-data-table-template-loader [template]=\"this.groupHeaderTemplate\" [data]=\"renderedItem.data\">\r\n </sme-data-table-template-loader>\r\n </span>\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && !renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\"\r\n [ngClass]=\"{'sme-expandable': renderedItem.hasChildren && !renderedItem.node.isLeaf}\">\r\n <span class=\"sme-icon sme-icon-size-xxs\" role=\"button\"\r\n [attr.aria-expanded]=\"renderedItem.node.expanded?'true':'false'\"\r\n (click)=\"clickTreeToggle($event, renderedItem)\"\r\n [ngClass]=\"{'sme-icon-chevronDown':renderedItem.node.expanded, 'sme-icon-chevronRight':!renderedItem.node.expanded}\"\r\n [attr.aria-label]=\"renderedItem.node.expanded ? this.strings.MsftSmeShell.Angular.DataTable.aria.label.collapse : this.strings.MsftSmeShell.Angular.DataTable.aria.label.expand\">\r\n </span>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\">\r\n <sme-loading-wheel size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\">\r\n </sme-loading-wheel>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div\r\n *ngIf=\"showAsTree && selectionMode==='multiple' && renderedItem.type==renderedItemTypeEnum.TreeNode && colIndex==0\"\r\n class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [attr.aria-checked]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n [attr.aria-labelledby]=\"idBag.firstDataColumn + renderedItem.index\"\r\n [checked]=\"isItemSelected(renderedItem)\" (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"!editable\">\r\n <div *ngIf=\"!column.bodyTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-full-height]=\"autoRowHeight\"\r\n [id]=\"getFirstColumnId(column, renderedItem)\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyTemplate\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-height-auto]=\"autoRowHeight\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\" [id]=\"getFirstColumnId(column, renderedItem)\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyTemplate\" [data]=\"renderedItem.data\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"editable && !column.bodyEditTemplate\">\r\n <div *ngIf=\"!column.bodyReadTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data.content,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyReadTemplate\"\r\n class=\"sme-table-cell\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\" [renderedItem]=\"renderedItem\"\r\n [template]=\"column.bodyReadTemplate\" [data]=\"renderedItem.data.content\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"editable && column.bodyEditTemplate\">\r\n <ng-container *ngIf=\"!shouldShowEditRow(renderedItem)\">\r\n <div *ngIf=\"!column.bodyReadTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data.content,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyReadTemplate\"\r\n class=\"sme-table-cell\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyReadTemplate\" [data]=\"renderedItem.data.content\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"shouldShowEditRow(renderedItem)\" class=\"sme-table-cell sme-table-edit-container\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyEditTemplate\" [field]=\"column.field\" [data]=\"renderedItem.data.content\"\r\n [rowIndex]=\"rowIndex\" [renderedItem]=\"renderedItem\"\r\n (validationAlert)=\"onValidationAlertHandler(renderedItem, column.field, $event.alert)\"\r\n (dataChanged)=\"onEditableDataChanged($event.renderedItem,$event.field)\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasValidationError(renderedItem)\" class=\"sme-table-row-validation\">\r\n <div class=\"sme-table-td sme-position-flex-auto\"\r\n [attr.role] = \"selectionMode === 'multiple' ? 'gridcell' : 'presentation'\"\r\n [attr.tabindex]=\"selectionMode==='multiple'?'0':'undefined'\">\r\n <div class=\"sme-table-cell\" role=\"presentation\">\r\n <div *ngFor=\"let validationResultItem of renderedItem.validationResult\">\r\n <sme-validation-alert [alert]=\"validationResultItem.alert\"></sme-validation-alert>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sme-table-row\" #tempRow>\r\n <div class=\"sme-table-td\" tabindex=\"0\">\r\n <div class=\"sme-table-cell\"> </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"shouldUseLastFocusableShadowElement\" #lastFocusableShadowElement class=\"sme-focus-zone\"\r\n data-sme-last-focusable-shadow-element (focus)=\"onLastFocusableShadowElementFocused($event)\" tabindex=\"0\"></div>\r\n </div>\r\n <div class=\"sme-layout-absolute sme-position-inset-none\"\r\n *ngIf=\"isBusy || (this.nodeNavigatingTask && this.nodeNavigatingTask.isRunning)\">\r\n <sme-loading-wheel [isBackgroundTransparent]=\"true\"></sme-loading-wheel>\r\n </div>\r\n</div>\r\n<div #resizerIndicator\r\n class=\"sme-width-xxs sme-layout-absolute sme-position-stretch-v sme-background-color-base-80 sme-layer-flyout sme-layout-none\">\r\n</div>\r\n" }]
|
|
5546
|
+
args: [{ selector: 'sme-tree-table', template: "<div role=\"presentation\" class=\"sme-table-header sme-focus-zone sme-data-table-transition\" #header\r\n [class.sme-shadow-scrolled-content]=\"isScrolledDown\" [class.sme-table-multi-select]=\"selectionMode==='multiple'\"\r\n [class.sme-table-selectable]=\"selectable\" [class.sme-table-indented]=\"!noLeftMargin\"\r\n [class.sme-table-select-all-enabled]=\"selectionMode==='multiple' && showAllItemCheckbox\">\r\n <!-- According to the accessibility team, data-table headers should be accessible by keyboard\r\n and the resizer should also be accessed by keyboard.-->\r\n <div #headerTable class=\"sme-table sme-table-virtualized sme-table-auto-width-phone-down\" role=\"rowgroup\">\r\n <div class=\"sme-table-row sme-arrange-stack-h sme-position-flex-auto\" role=\"row\"\r\n (keydown)=\"onHeaderTablePressed($event)\">\r\n <div class=\"sme-table-caption\" [attr.role]=\"selectionMode==='multiple'?'columnheader':'presentation'\"\r\n data-uta-id=\"checkboxColumn\">\r\n <div class=\"sme-table-checkbox sme-table-header-checkbox\"\r\n *ngIf=\"selectionMode==='multiple' && showAllItemCheckbox && showHeader\" role=\"presentation\">\r\n <input sme-lint-disable-self type=\"checkbox\" [attr.aria-label]=\"getAllItemCheckBoxAriaLabel()\"\r\n [checked]=\"shouldAllItemCheckBoxChecked()\"\r\n [attr.aria-checked]=\"shouldAllItemCheckBoxChecked()?'true':'false'\" (change)=\"onAllItemCheckBoxClicked()\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex = index\" [attr.field]=\"column.field\"\r\n [ngStyle]=\"{'width': column.width}\"\r\n class=\"sme-table-caption sme-table-column-header sme-position-flex-auto {{column.styleClass}}\"\r\n role=\"presentation\" [attr.data-uta-id]=\"column.utaId\" [attr.column-index]=\"colIndex\">\r\n <div *ngIf=\"column.sortable && column.sortable!='false' && showHeader\"\r\n class=\"sme-table-header-cell sme-focus-zone\" (click)=\"clickColumn(column)\" role=\"columnheader\"\r\n [title]=\"column.header\" aria-live=\"polite\" tabindex=\"0\" [attr.aria-sort]=\"columnSortSettings[column.header]\"\r\n [attr.aria-label]=\"column.sortable ? getSortLabel(column) : null\">\r\n <span>{{column.header}}</span>\r\n <span class=\"sme-icon sme-margin-left-xxs\"\r\n [ngClass]=\"{'sme-icon-up':column.sortMode===sortModeEnum.Ascend,'sme-icon-down':column.sortMode===sortModeEnum.Descend}\">\r\n </span>\r\n </div>\r\n <div *ngIf=\"!(column.sortable && column.sortable!='false') && showHeader\"\r\n class=\"sme-table-header-cell sme-focus-zone\" role=\"columnheader\" [title]=\"column.header\" tabindex=\"0\"\r\n [attr.aria-label]=\"column.sortable ? getSortLabel(column) : null\">\r\n <span>{{column.header}}</span>\r\n <span class=\"sme-icon sme-margin-left-xxs\"\r\n [ngClass]=\"{'sme-icon-up':column.sortMode===sortModeEnum.Ascend,'sme-icon-down':column.sortMode===sortModeEnum.Descend}\"></span>\r\n </div>\r\n <div *ngIf=\"!showHeader\" class=\"sme-table-header-cell\" role=\"columnheader\">\r\n </div>\r\n <sme-resizer [focusable]=\"false\" *ngIf=\"colIndex!==actualColumns.length-1 && showHeader\"\r\n resizerHostSelector=\"div.sme-table-header\" (resized)=\"onColumnResized(colIndex, $event)\"\r\n [visibleToScreenReader]=\"true\" [showResizerCover]=\"false\" orientation=\"left\"\r\n (resizing)=\"onColumnResizing($event)\" class=\"sme-focus-zone\"></sme-resizer>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"sme-focus-zone sme-table-container sme-data-table-transition\" #content role=\"presentation\"\r\n [class.sme-table-multi-select]=\"selectionMode==='multiple'\" [class.sme-table-selectable]=\"selectable\"\r\n [class.sme-margin-top-none]=\"!showHeader\" [class.sme-table-indented]=\"!noLeftMargin\"\r\n [class.sme-table-grid-lines]=\"showGrid\"\r\n [class.sme-table-select-all-enabled]=\"selectionMode==='multiple' && showAllItemCheckbox\"\r\n [class.sme-table-editable]=\"editable\">\r\n <div class=\"sme-table-scroll-container sme-layout-absolute sme-position-inset-none\"\r\n [ngClass]=\"{'sme-layout-absolute sme-position-inset-none': scrollable, 'sme-scrollable': shouldScroll}\"\r\n #scrollContainer role=\"rowgroup\">\r\n <div role=\"row\" class=\"sme-table-row sme-table-row-placeholder\" #emptyMessage tabindex=\"0\"\r\n *ngIf=\"showNoRecordsMessage()\" data-uta-id=\"empty-table-message\">\r\n <sme-loading-wheel *ngIf=\"isLoading || !isColumnWidthCalculated\" [message]=\"loadingMessage\">\r\n </sme-loading-wheel>\r\n <div class=\"sme-table-cell sme-table-cell-placeholder\"> </div>\r\n <div role=\"gridcell\" class=\"sme-table-cell\">{{getNoRecordsMessage()}}</div>\r\n </div>\r\n <div class=\"sme-layout-relative sme-position-stretch-h sme-arrange-overflow-hide\" #scrollBody role=\"presentation\">\r\n <div class=\"sme-table sme-table-scrollable sme-table-virtualized\" #scrollAboveData\r\n [ngStyle]=\"{top: scrollAboveDataStyleTop}\" [attr.aria-hidden]=\"true\" sme-lint-disable>\r\n <!-- Above view port -->\r\n <div *ngFor=\"let renderedItem of renderedItemsAboveViewPort; let rowIndex = index\"\r\n class=\"sme-table-row sme-table-row-data sme-table-row-selectable\"\r\n [class.sme-table-row-active]=\"renderedItem.index === getActiveRenderedItemIndex()\"\r\n [class.sme-table-row-selected]=\"renderedItem.index === getActiveRenderedItemIndex() || isItemSelected(renderedItem)\"\r\n [class.sme-table-group-item]=\"renderedItem.type === renderedItemTypeEnum.GroupItem\"\r\n [class.sme-table-group-header]=\"renderedItem.type === renderedItemTypeEnum.GroupHeader\"\r\n [class.sme-checked]=\"isItemSelected(renderedItem)\">\r\n <div class=\"sme-arrange-stack-h\">\r\n <div class=\"sme-table-td sme-position-flex-auto\">\r\n <div class=\"sme-table-cell\">\r\n <div *ngIf=\"!showAsTree\" class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [checked]=\"isItemSelected(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex=index\"\r\n [ngClass]=\"{'sme-table-column-first': isFirstDataColumn(column), 'sme-table-group-header-cell': renderedItem.type===renderedItemTypeEnum.GroupHeader}\"\r\n [ngStyle]=\"{'width':column.domWidth+'px'}\"\r\n class=\"sme-table-td sme-position-flex-auto {{column.styleClass}}\"\r\n [attr.tabindex]=\"isTreeTableParentNode(renderedItem) ? -1 : 0\">\r\n <div class=\"sme-screen-reader sme-screen-reader-disable-copy\" *ngIf=\"isFirstDataColumn(column)\">\r\n {{getAdditionalScreenRecorderContent(renderedItem)}}</div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.GroupHeader && colIndex===0\" class=\"sme-table-cell\"\r\n (click)=\"clickGroupToggle(renderedItem)\">\r\n <span *ngIf=\"useGroupToggle\" class=\"sme-icon sme-icon-size-xxs sme-margin-right-xxs\"\r\n [ngClass]=\"{'sme-icon-chevronDown':isGroupExpanded(renderedItem.data), 'sme-icon-chevronRight':!isGroupExpanded(renderedItem.data)}\">\r\n </span>\r\n <span *ngIf=\"!this.groupHeaderTemplate\">\r\n {{renderedItem.data}}\r\n </span>\r\n <span *ngIf=\"this.groupHeaderTemplate\">\r\n <sme-data-table-template-loader [template]=\"this.groupHeaderTemplate\" [data]=\"renderedItem.data\">\r\n </sme-data-table-template-loader>\r\n </span>\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && !renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\"\r\n [ngClass]=\"{'sme-expandable': renderedItem.hasChildren && !renderedItem.node.isLeaf}\">\r\n <span class=\"sme-icon sme-icon-size-xxs\" role=\"button\"\r\n [attr.aria-expanded]=\"renderedItem.node.expanded?'true':'false'\"\r\n (click)=\"clickTreeToggle($event, renderedItem)\"\r\n [ngClass]=\"{'sme-icon-chevronDown':renderedItem.node.expanded, 'sme-icon-chevronRight':!renderedItem.node.expanded}\"\r\n [attr.aria-label]=\"renderedItem.node.expanded ? this.strings.MsftSmeShell.Angular.DataTable.aria.label.collapse : this.strings.MsftSmeShell.Angular.DataTable.aria.label.expand\">\r\n </span>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\">\r\n <sme-loading-wheel size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\">\r\n </sme-loading-wheel>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div\r\n *ngIf=\"showAsTree && selectionMode==='multiple' && renderedItem.type==renderedItemTypeEnum.TreeNode && colIndex==0\"\r\n class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [checked]=\"isItemSelected(renderedItem)\"\r\n (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"!editable\">\r\n <div *ngIf=\"!column.bodyTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-full-height]=\"autoRowHeight\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data,column.field):'.'}}\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyTemplate\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\" [class.sme-table-cell-height-auto]=\"autoRowHeight\"\r\n class=\"sme-table-cell\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyTemplate\" [data]=\"renderedItem.data\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sme-table sme-table-scrollable\" #scrollData [class.sme-table-virtualized]=\"!disableUIVirtualization\"\r\n [ngStyle]=\"{top: scrollDataStyleTop}\" sme-lint-disable role=\"presentation\">\r\n <div *ngFor=\"let renderedItem of renderedItemsInAndBelowViewPort; let rowIndex = index\"\r\n (keydown)=\"onContentTablePressed($event)\" (keyup)=\"onContentTableKeyUp($event)\"\r\n (contextmenu)=\"enableRightClickSelect ? selectItem($event, renderedItem) : true\"\r\n (click)=\"selectItem($event, renderedItem)\" class=\"sme-table-row sme-table-row-data sme-table-row-selectable\"\r\n [class.sme-table-row-active]=\"renderedItem.index === getActiveRenderedItemIndex()\"\r\n [class.sme-table-row-selected]=\"rowDisplayAsSelected(renderedItem)\"\r\n [class.sme-table-group-item]=\"renderedItem.type === renderedItemTypeEnum.GroupItem\"\r\n [class.sme-table-group-header]=\"renderedItem.type === renderedItemTypeEnum.GroupHeader\"\r\n [class.sme-checked]=\"isItemSelected(renderedItem)\" [class.sme-table-row-editable]=\"editable\"\r\n [class.sme-has-validation-error]=\"hasValidationError(renderedItem)\"\r\n [class.sme-data-table-row-new-item]=\"renderedItem?.data?.isNewRow\"\r\n [attr.tabindex]=\"renderedItem.index >= 0 ? 0 : undefined\" (dblclick)=\"doubleClickRow($event,renderedItem)\"\r\n (focus)=\"onContentItemFocused($event, renderedItem)\" (focusin)=\"onContentItemFocused($event, renderedItem)\"\r\n (focusout)=\"onContentItemBlurred($event, renderedItem)\" [attr.data-rendered-item-index]=\"renderedItem.index\"\r\n [attr.aria-rowindex]=\"renderedItem.index+2\" [attr.aria-selected]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n (mouseenter)=\"setHoveredRenderedItem(renderedItem)\" (mouseleave)=\"unsetHoveredRenderedItem(renderedItem)\"\r\n role=\"row\" [attr.aria-expanded]=\"getAriaExpandedAttributeValue(renderedItem)\"\r\n [attr.aria-level]=\"showAsTree && renderedItem.depth ? (renderedItem.depth+1):undefined\">\r\n <div class=\"sme-arrange-stack-h\" role=\"presentation\">\r\n <div class=\"sme-table-td sme-position-flex-auto\"\r\n [attr.role]=\"selectionMode === 'multiple' ? 'gridcell': 'presentation'\">\r\n <div *ngIf=\"!showAsTree\" class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [attr.aria-checked]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n [attr.aria-labelledby]=\"idBag.firstDataColumn + renderedItem.index\"\r\n [checked]=\"isItemSelected(renderedItem)\" (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngFor=\"let column of actualColumns; let colIndex=index\"\r\n [ngClass]=\"{'sme-table-column-first': isFirstDataColumn(column), 'sme-table-group-header-cell': renderedItem.type===renderedItemTypeEnum.GroupHeader}\"\r\n [ngStyle]=\"{'width':column.domWidth+'px'}\"\r\n class=\"sme-table-td sme-position-flex-auto {{column.styleClass}}\" role=\"gridcell\"\r\n [attr.aria-rowindex]=\"renderedItem.index+2\"\r\n [attr.tabindex]=\"isTreeTableParentNode(renderedItem) ? -1 : 0\">\r\n <div class=\"sme-screen-reader sme-screen-reader-disable-copy\" *ngIf=\"isFirstDataColumn(column)\">\r\n {{getAdditionalScreenRecorderContent(renderedItem)}}</div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.GroupHeader && colIndex===0\" class=\"sme-table-cell\"\r\n (click)=\"clickGroupToggle(renderedItem)\" [id]=\"getFirstColumnId(column, renderedItem)\">\r\n <span *ngIf=\"useGroupToggle\" class=\"sme-icon sme-icon-size-xxs sme-margin-right-xxs\"\r\n [ngClass]=\"{'sme-icon-chevronDown':isGroupExpanded(renderedItem.data), 'sme-icon-chevronRight':!isGroupExpanded(renderedItem.data)}\">\r\n </span>\r\n <span *ngIf=\"!this.groupHeaderTemplate\">\r\n {{renderedItem.data}}\r\n </span>\r\n <span *ngIf=\"this.groupHeaderTemplate\">\r\n <sme-data-table-template-loader [template]=\"this.groupHeaderTemplate\" [data]=\"renderedItem.data\">\r\n </sme-data-table-template-loader>\r\n </span>\r\n </div>\r\n <div\r\n *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && !renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\"\r\n [ngClass]=\"{'sme-expandable': renderedItem.hasChildren && !renderedItem.node.isLeaf}\">\r\n <span class=\"sme-icon sme-icon-size-xxs\" role=\"button\"\r\n [attr.aria-expanded]=\"renderedItem.node.expanded?'true':'false'\"\r\n (click)=\"clickTreeToggle($event, renderedItem)\"\r\n [ngClass]=\"{'sme-icon-chevronDown':renderedItem.node.expanded, 'sme-icon-chevronRight':!renderedItem.node.expanded}\"\r\n [attr.aria-label]=\"renderedItem.node.expanded ? this.strings.MsftSmeShell.Angular.DataTable.aria.label.collapse : this.strings.MsftSmeShell.Angular.DataTable.aria.label.expand\">\r\n </span>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div *ngIf=\"renderedItem.type===renderedItemTypeEnum.TreeNode && renderedItem.node.isBusy && colIndex===0\"\r\n class=\"sme-table-expander-cell\" [ngStyle]=\"{'padding-left':(renderedItem.depth*16+4)+'px'}\">\r\n <sme-loading-wheel size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\">\r\n </sme-loading-wheel>\r\n <span class=\"sme-table-expander-cell-placeholder\"></span>\r\n </div>\r\n <div\r\n *ngIf=\"showAsTree && selectionMode==='multiple' && renderedItem.type==renderedItemTypeEnum.TreeNode && colIndex==0\"\r\n class=\"sme-table-cell sme-table-checkbox-container\" role=\"presentation\">\r\n <div class=\"sme-table-checkbox\" role=\"presentation\">\r\n <input type=\"checkbox\" [attr.aria-checked]=\"isItemSelected(renderedItem)?'true':'false'\"\r\n [attr.aria-labelledby]=\"idBag.firstDataColumn + renderedItem.index\"\r\n [checked]=\"isItemSelected(renderedItem)\" (change)=\"onItemCheckBoxClicked(renderedItem)\" />\r\n <label role=\"presentation\"></label>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"!editable\">\r\n <div *ngIf=\"!column.bodyTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-full-height]=\"autoRowHeight\"\r\n [id]=\"getFirstColumnId(column, renderedItem)\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyTemplate\"\r\n class=\"sme-table-cell\" [class.sme-table-cell-height-auto]=\"autoRowHeight\"\r\n [class.sme-table-cell-full-height]=\"autoRowHeight\" [id]=\"getFirstColumnId(column, renderedItem)\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyTemplate\" [data]=\"renderedItem.data\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"editable && !column.bodyEditTemplate\">\r\n <div *ngIf=\"!column.bodyReadTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data.content,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyReadTemplate\"\r\n class=\"sme-table-cell\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\" [renderedItem]=\"renderedItem\"\r\n [template]=\"column.bodyReadTemplate\" [data]=\"renderedItem.data.content\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"editable && column.bodyEditTemplate\">\r\n <ng-container *ngIf=\"!shouldShowEditRow(renderedItem)\">\r\n <div *ngIf=\"!column.bodyReadTemplate && renderedItem.type!=renderedItemTypeEnum.GroupHeader\"\r\n class=\"sme-table-cell\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n {{renderedItem.data?resolveObjectPath(renderedItem.data.content,column.field):'.'}}</div>\r\n <div\r\n *ngIf=\"renderedItem.type!=renderedItemTypeEnum.GroupHeader && renderedItem.data && column.bodyReadTemplate\"\r\n class=\"sme-table-cell\" [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyReadTemplate\" [data]=\"renderedItem.data.content\" [rowIndex]=\"rowIndex\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"shouldShowEditRow(renderedItem)\" class=\"sme-table-cell sme-table-edit-container\"\r\n [title]=\"getColumnTooltipText(column, renderedItem)\">\r\n <sme-data-table-template-loader *ngIf=\"!renderedItem.data.placeholder\"\r\n [template]=\"column.bodyEditTemplate\" [field]=\"column.field\" [data]=\"renderedItem.data.content\"\r\n [rowIndex]=\"rowIndex\" [renderedItem]=\"renderedItem\"\r\n (validationAlert)=\"onValidationAlertHandler(renderedItem, column.field, $event.alert)\"\r\n (dataChanged)=\"onEditableDataChanged($event.renderedItem,$event.field)\">\r\n </sme-data-table-template-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasValidationError(renderedItem)\" class=\"sme-table-row-validation\">\r\n <div class=\"sme-table-td sme-position-flex-auto\"\r\n [attr.role]=\"selectionMode === 'multiple' ? 'gridcell' : 'presentation'\"\r\n [attr.tabindex]=\"selectionMode==='multiple'?'0':'undefined'\">\r\n <div class=\"sme-table-cell\" role=\"presentation\">\r\n <div *ngFor=\"let validationResultItem of renderedItem.validationResult\">\r\n <sme-validation-alert [alert]=\"validationResultItem.alert\"></sme-validation-alert>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sme-table-row\" #tempRow>\r\n <div class=\"sme-table-td\" tabindex=\"0\">\r\n <div class=\"sme-table-cell\"> </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"shouldUseLastFocusableShadowElement\" #lastFocusableShadowElement class=\"sme-focus-zone\"\r\n data-sme-last-focusable-shadow-element (focus)=\"onLastFocusableShadowElementFocused($event)\" tabindex=\"0\"></div>\r\n </div>\r\n <div class=\"sme-layout-absolute sme-position-inset-none\"\r\n *ngIf=\"isBusy || (this.nodeNavigatingTask && this.nodeNavigatingTask.isRunning)\">\r\n <sme-loading-wheel [isBackgroundTransparent]=\"true\"></sme-loading-wheel>\r\n </div>\r\n</div>\r\n<div #resizerIndicator\r\n class=\"sme-width-xxs sme-layout-absolute sme-position-stretch-v sme-background-color-base-80 sme-layer-flyout sme-layout-none\">\r\n</div>\r\n" }]
|
|
5549
5547
|
}], function () { return [{ type: i0.Injector }]; }, null); })();
|
|
5550
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDakcsT0FBTyxFQUE0QixzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzNILE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFJSCwyQkFBMkIsRUFFM0IseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUtwQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ3ZDN0MsK0JBQzhGLGdCQUFBO0lBR3RCLGtLQUFVLGVBQUEsa0NBQTBCLENBQUEsSUFBQztJQUYzRyxpQkFFOEc7SUFDOUcsNEJBQW1DO0lBQ3JDLGlCQUFNOzs7SUFIRixlQUEwQztJQUExQywrREFBMEM7SUFEQyxrRUFBaUQsMEVBQUE7Ozs7O0lBVWhHLCtCQUUrRztJQURoRSxxTkFBUyxlQUFBLCtCQUFtQixDQUFBLElBQUM7SUFFMUUsNEJBQU07SUFBQSxZQUFpQjtJQUFBLGlCQUFPO0lBQzlCLDJCQUNrSTtJQUNwSSxpQkFBTTs7OztJQUpKLHlDQUF1QjtJQUFpQywwRUFBb0Q7SUFDdEcsZUFBaUI7SUFBakIsdUNBQWlCO0lBRXJCLGVBQXdIO0lBQXhILGdLQUF3SDtJQUQvRSwyRkFBaUU7OztJQUc5RywrQkFDMkQsV0FBQTtJQUNuRCxZQUFpQjtJQUFBLGlCQUFPO0lBQzlCLDJCQUNrSTtJQUNwSSxpQkFBTTs7OztJQUpnQix5Q0FBdUI7SUFDckMsZUFBaUI7SUFBakIsdUNBQWlCO0lBRXJCLGVBQXdIO0lBQXhILGdLQUF3SDtJQUQvRSwyRkFBaUU7OztJQUc5RywwQkFDTTs7OztJQUNOLHVDQUcrRDtJQUZsQiw2T0FBVyxlQUFBLDZDQUFpQyxDQUFBLElBQUMsb0xBRTVFLGVBQUEsZ0NBQXdCLENBQUEsSUFGb0Q7SUFFM0IsaUJBQWM7O0lBSGhFLGlDQUFtQiwrQkFBQSwyQkFBQTs7OztJQW5CbEMsK0JBR3VGO0lBQ3JGLDBFQU1NO0lBQ04sMEVBS007SUFDTiwwRUFDTTtJQUNOLDBGQUc2RTtJQUMvRSxpQkFBTTs7Ozs7SUFyQkoseUhBQThGO0lBRDlGLHdFQUFtQztJQUQyQix5Q0FBMkIsaUNBQUEsOEJBQUE7SUFJbkYsZUFBK0Q7SUFBL0QsaUdBQStEO0lBTy9ELGVBQWtFO0lBQWxFLG9HQUFrRTtJQU1sRSxlQUFpQjtJQUFqQix5Q0FBaUI7SUFFVyxlQUFxRDtJQUFyRCw0RkFBcUQ7OztJQW1CekYsd0NBQ29COzs7SUFENkMsZ0RBQTBCOzs7SUFGN0YsbUNBQ21FO0lBQ2pFLHVHQUNvQjtJQUNwQiwrQkFBdUQ7SUFBQSxzQkFBTTtJQUFBLGlCQUFNO0lBQ25FLCtCQUE0QztJQUFBLFlBQXlCO0lBQUEsaUJBQU0sRUFBQTs7O0lBSHZELGVBQTJDO0lBQTNDLDBFQUEyQztJQUduQixlQUF5QjtJQUF6QixrREFBeUI7OztJQWdCM0QsK0JBQXdFO0lBQ3RFLDRCQUFrRSxnQkFBQTtJQUVwRSxpQkFBTTs7OztJQUZtQixlQUF3QztJQUF4QyxrRUFBd0M7OztJQVVuRSwrQkFBZ0c7SUFDOUYsWUFBb0Q7SUFBQSxpQkFBTTs7OztJQUExRCxlQUFvRDtJQUFwRCw0RkFBb0Q7Ozs7SUFHcEQsMkJBRU87Ozs7SUFETCxzSkFBb0k7OztJQUV0SSw0QkFBd0M7SUFDdEMsWUFDRjtJQUFBLGlCQUFPOzs7SUFETCxlQUNGO0lBREUsc0RBQ0Y7OztJQUNBLDRCQUF1QztJQUNyQyxxREFDaUM7SUFDbkMsaUJBQU87Ozs7SUFGMkIsZUFBcUM7SUFBckMsc0RBQXFDLCtCQUFBOzs7O0lBVHpFLCtCQUMyQztJQUF6QyxtT0FBUyxlQUFBLDBDQUE4QixDQUFBLElBQUM7SUFDeEMseUZBRU87SUFDUCx5RkFFTztJQUNQLHlGQUdPO0lBQ1QsaUJBQU07OztJQVZHLGVBQW9CO0lBQXBCLDZDQUFvQjtJQUdwQixlQUErQjtJQUEvQixtREFBK0I7SUFHL0IsZUFBOEI7SUFBOUIsa0RBQThCOzs7Ozs7SUFLdkMsK0JBR3dGLGVBQUE7SUFHcEYsME9BQVMsZUFBQSxpREFBcUMsQ0FBQSxJQUFDO0lBR2pELGlCQUFPO0lBQ1AsMkJBQXlEO0lBQzNELGlCQUFNOzs7O0lBVDRCLDZGQUEyRCx1R0FBQTtJQUt6RixlQUFvSDtJQUFwSCxzSEFBb0g7SUFGcEgsa0ZBQWdFLHNMQUFBOzs7SUFPcEUsK0JBQzhGO0lBQzVGLHdDQUNvQixlQUFBO0lBRXRCLGlCQUFNOzs7SUFKNEIsNkZBQTJEO0lBQ3JELGVBQWU7SUFBZiw2QkFBZSxpQ0FBQTs7OztJQUl2RCwrQkFFMEUsY0FBQSxnQkFBQTtJQUdwRSx1T0FBVSxlQUFBLCtDQUFtQyxDQUFBLElBQUM7SUFEaEQsaUJBQ21EO0lBQ25ELDRCQUFtQztJQUNyQyxpQkFBTSxFQUFBOzs7O0lBSG1CLGVBQXdDO0lBQXhDLGtFQUF3Qzs7O0lBTWpFLCtCQUM0RTtJQUMxRSxZQUNGO0lBQUEsaUJBQU07Ozs7O0lBRm1CLG1FQUFrRDtJQUN6RSxlQUNGO0lBREUsaUlBQ0Y7OztJQUtFLHFEQUVpQzs7Ozs7O0lBRC9CLGtEQUFnQywrQkFBQSwwQkFBQTs7O0lBTHBDLCtCQUd5QjtJQUN2Qiw0SkFFaUM7SUFDbkMsaUJBQU07Ozs7SUFMSixtRUFBa0QscURBQUE7SUFFakIsZUFBb0M7SUFBcEMseURBQW9DOzs7SUFUekUsNkJBQWdDO0lBQzlCLGdHQUdNO0lBQ04sZ0dBT007SUFDUiwwQkFBZTs7Ozs7SUFaUCxlQUFpRjtJQUFqRixvSEFBaUY7SUFLcEYsZUFBcUc7SUFBckcsNElBQXFHOzs7O0lBckQ1RywrQkFJaUU7SUFDL0QsaUZBQzREO0lBQzVELGlGQVlNO0lBQ04sa0ZBV007SUFDTixpRkFLTTtJQUNOLGlGQVFNO0lBQ04sbUdBYWU7SUFDakIsaUJBQU07Ozs7OztJQTFESiw0RkFBaUU7SUFGakUsaUtBQXNKLHFFQUFBO0lBR3RKLG9GQUE4RDtJQUNDLGVBQStCO0lBQS9CLDREQUErQjtJQUV4RixlQUEwRTtJQUExRSwrR0FBMEU7SUFjN0UsZUFBb0c7SUFBcEcsNklBQW9HO0lBV2pHLGVBQW1HO0lBQW5HLDRJQUFtRztJQU90RyxlQUFpSDtJQUFqSCx3S0FBaUg7SUFRckcsZUFBZTtJQUFmLHdDQUFlOzs7SUEvRHBDLCtCQU1xRCxjQUFBLGNBQUEsY0FBQTtJQUk3QywyRUFHTTtJQUNSLGlCQUFNLEVBQUE7SUFFUiw0RUE2RE07SUFDUixpQkFBTSxFQUFBOzs7O0lBNUVOLHNHQUFrRixxSUFBQSx5RkFBQSw2RkFBQSx3REFBQTtJQVF0RSxlQUFpQjtJQUFqQix5Q0FBaUI7SUFNSCxlQUFrQjtJQUFsQiw4Q0FBa0I7Ozs7SUF3RnhDLCtCQUNxRCxjQUFBLGdCQUFBO0lBSU4sZ09BQVUsZUFBQSwrQ0FBbUMsQ0FBQSxJQUFDO0lBRnpGLGlCQUU0RjtJQUM1Riw0QkFBbUM7SUFDckMsaUJBQU0sRUFBQTs7OztJQU5OLG1FQUFrRDtJQUk5QyxlQUF3QztJQUF4QyxrRUFBd0M7SUFGbkIsMkZBQWlFLDJFQUFBOzs7SUFhNUYsK0JBQWdHO0lBQzlGLFlBQW9EO0lBQUEsaUJBQU07Ozs7SUFBMUQsZUFBb0Q7SUFBcEQsNEZBQW9EOzs7SUFHcEQsMkJBRU87Ozs7SUFETCxzSkFBb0k7OztJQUV0SSw0QkFBd0M7SUFDdEMsWUFDRjtJQUFBLGlCQUFPOzs7SUFETCxlQUNGO0lBREUsc0RBQ0Y7OztJQUNBLDRCQUF1QztJQUNyQyxxREFDaUM7SUFDbkMsaUJBQU87Ozs7SUFGMkIsZUFBcUM7SUFBckMsdURBQXFDLCtCQUFBOzs7O0lBVHpFLCtCQUN5RjtJQUF2RixxT0FBUyxlQUFBLDJDQUE4QixDQUFBLElBQUM7SUFDeEMseUZBRU87SUFDUCx5RkFFTztJQUNQLHlGQUdPO0lBQ1QsaUJBQU07Ozs7O0lBWHFDLDJFQUE2QztJQUMvRSxlQUFvQjtJQUFwQiw2Q0FBb0I7SUFHcEIsZUFBK0I7SUFBL0IsbURBQStCO0lBRy9CLGVBQThCO0lBQTlCLGtEQUE4Qjs7OztJQUt2QywrQkFHd0YsZUFBQTtJQUdwRiw0T0FBUyxlQUFBLGtEQUFxQyxDQUFBLElBQUM7SUFHakQsaUJBQU87SUFDUCwyQkFBeUQ7SUFDM0QsaUJBQU07Ozs7SUFUNEIsNkZBQTJELHVHQUFBO0lBS3pGLGVBQW9IO0lBQXBILHNIQUFvSDtJQUZwSCxrRkFBZ0Usc0xBQUE7OztJQU9wRSwrQkFDOEY7SUFDNUYsd0NBQ29CLGVBQUE7SUFFdEIsaUJBQU07OztJQUo0Qiw2RkFBMkQ7SUFDckQsZUFBZTtJQUFmLDZCQUFlLGlDQUFBOzs7O0lBSXZELCtCQUUwRSxjQUFBLGdCQUFBO0lBSTNCLHlPQUFVLGVBQUEsZ0RBQW1DLENBQUEsSUFBQztJQUZ6RixpQkFFNEY7SUFDNUYsNEJBQW1DO0lBQ3JDLGlCQUFNLEVBQUE7Ozs7SUFGRixlQUF3QztJQUF4QyxrRUFBd0M7SUFGbkIsMkZBQWlFLDJFQUFBOzs7SUFPMUYsK0JBR3VEO0lBQ3JELFlBQTJFO0lBQUEsaUJBQU07Ozs7O0lBSDFELG9FQUFrRDtJQUN6RSw0RUFBNkMsc0VBQUE7SUFFN0MsZUFBMkU7SUFBM0UsaUlBQTJFOzs7SUFNM0UscURBRWlDOzs7Ozs7SUFEL0Isa0RBQWdDLCtCQUFBLDBCQUFBOzs7SUFOcEMsK0JBSXVEO0lBQ3JELDRKQUVpQztJQUNuQyxpQkFBTTs7Ozs7SUFObUIsb0VBQWtELHNEQUFBO0lBQ3RCLDRFQUE2QyxzRUFBQTtJQUUvRCxlQUFvQztJQUFwQyx5REFBb0M7OztJQVh6RSw2QkFBZ0M7SUFDOUIsZ0dBSW1GO0lBQ25GLGdHQVFNO0lBQ1IsMEJBQWU7Ozs7O0lBZFAsZUFBaUY7SUFBakYsb0hBQWlGO0lBTXBGLGVBQXFHO0lBQXJHLDRJQUFxRzs7O0lBVXhHLCtCQUV1RDtJQUNyRCxZQUFtRjtJQUFBLGlCQUFNOzs7OztJQUR6RixtRkFBb0Q7SUFDcEQsZUFBbUY7SUFBbkYseUlBQW1GOzs7SUFLbkYscURBRWlDOzs7Ozs7SUFGc0MsK0NBQTZCLHlDQUFBLHVDQUFBLDBCQUFBOzs7SUFKdEcsK0JBR3VEO0lBQ3JELDRKQUVpQztJQUNuQyxpQkFBTTs7Ozs7SUFKSixtRkFBb0Q7SUFDbkIsZUFBb0M7SUFBcEMseURBQW9DOzs7SUFUekUsNkJBQTJEO0lBQ3pELGdHQUcyRjtJQUMzRixnR0FPTTtJQUNSLDBCQUFlOzs7OztJQVpQLGVBQXFGO0lBQXJGLHdIQUFxRjtJQUt4RixlQUF5RztJQUF6RyxnSkFBeUc7OztJQVUxRywrQkFFdUQ7SUFDckQsWUFBbUY7SUFBQSxpQkFBTTs7Ozs7SUFEekYsbUZBQW9EO0lBQ3BELGVBQW1GO0lBQW5GLHlJQUFtRjs7O0lBS25GLHFEQUVpQzs7Ozs7O0lBRC9CLHNEQUFvQyx1Q0FBQSwwQkFBQTs7O0lBTHhDLCtCQUd1RDtJQUNyRCwyS0FFaUM7SUFDbkMsaUJBQU07Ozs7O0lBSkosbUZBQW9EO0lBQ25CLGVBQW9DO0lBQXBDLHlEQUFvQzs7O0lBVHpFLDZCQUF1RDtJQUNyRCwrR0FHMkY7SUFDM0YsK0dBT007SUFDUiwwQkFBZTs7Ozs7SUFaUCxlQUFxRjtJQUFyRix5SEFBcUY7SUFLeEYsZUFBeUc7SUFBekcsaUpBQXlHOzs7O0lBVTVHLDBEQUkwRTtJQUR4RSwyWEFBbUIsZUFBQSxtRkFBa0UsQ0FBQSxJQUFDLDhQQUN2RSxlQUFBLGlFQUF1RCxDQUFBLElBRGdCO0lBRXhGLGlCQUFpQzs7Ozs7O0lBSi9CLHNEQUFvQywyQkFBQSx1Q0FBQSwwQkFBQSxrQ0FBQTs7O0lBSHhDLCtCQUN1RDtJQUNyRCw0SkFLaUM7SUFDbkMsaUJBQU07Ozs7O0lBUEosbUZBQW9EO0lBQ25CLGVBQW9DO0lBQXBDLHlEQUFvQzs7O0lBakJ6RSw2QkFBMEQ7SUFDeEQsa0hBYWU7SUFDZixnR0FRTTtJQUNSLDBCQUFlOzs7O0lBdkJFLGVBQXNDO0lBQXRDLG1FQUFzQztJQWMvQyxlQUFxQztJQUFyQyxrRUFBcUM7OztJQTlGL0MsK0JBS2lFO0lBQy9ELGlGQUM0RDtJQUM1RCxpRkFZTTtJQUNOLGtGQVdNO0lBQ04saUZBS007SUFDTixpRkFTTTtJQUNOLG1HQWVlO0lBQ2YsbUdBYWU7SUFDZixtR0F3QmU7SUFDakIsaUJBQU07Ozs7OztJQXJHSiw0RkFBaUU7SUFGakUsaUtBQXNKLHFFQUFBO0lBR3RJLDJEQUEyQyxzRUFBQTtJQUVJLGVBQStCO0lBQS9CLDREQUErQjtJQUV4RixlQUEwRTtJQUExRSwrR0FBMEU7SUFjN0UsZUFBb0c7SUFBcEcsNklBQW9HO0lBV2pHLGVBQW1HO0lBQW5HLDRJQUFtRztJQU90RyxlQUFpSDtJQUFqSCx3S0FBaUg7SUFTckcsZUFBZTtJQUFmLHdDQUFlO0lBZ0JmLGVBQTBDO0lBQTFDLHVFQUEwQztJQWMxQyxlQUF5QztJQUF6QyxzRUFBeUM7OztJQWdDdEQsMkJBQXdFO0lBQ3RFLDRDQUFrRjtJQUNwRixpQkFBTTs7O0lBRGtCLGVBQW9DO0lBQXBDLHVEQUFvQzs7O0lBTmxFLCtCQUErRSxjQUFBLGNBQUE7SUFLekUsaUZBRU07SUFDUixpQkFBTSxFQUFBLEVBQUE7Ozs7SUFOTixlQUEwRTtJQUExRSwwRkFBMEUsc0VBQUE7SUFHbEMsZUFBZ0M7SUFBaEMsMkRBQWdDOzs7O0lBOUk5RSwrQkFpQjBGO0lBaEJ4RiwyS0FBVyxlQUFBLHNDQUE2QixDQUFBLElBQUMsMEpBQVUsZUFBQSxvQ0FBMkIsQ0FBQSxJQUFyQywwT0FDMUIsaURBQXlCLDZDQUFnQyxHQUFHLElBQUksQ0FBQSxJQUR0Qyw4TkFFaEMsZUFBQSw2Q0FBZ0MsQ0FBQSxJQUZBLG9PQVU2QixlQUFBLGlEQUFtQyxDQUFBLElBVmhFLDhOQVdoQyxlQUFBLHVEQUEwQyxDQUFBLElBWFYsa09BV3VCLGVBQUEsdURBQTBDLENBQUEsSUFYakUsb09BWTdCLGVBQUEsdURBQTBDLENBQUEsSUFaYixrT0FjM0IsZUFBQSxpREFBb0MsQ0FBQSxJQWRULGtPQWN5QixlQUFBLG1EQUFzQyxDQUFBLElBZC9EO0lBaUJ6QywrQkFBcUQsY0FBQTtJQUdqRCwyRUFRTTtJQUNSLGlCQUFNO0lBQ04sNEVBd0dNO0lBQ1IsaUJBQU07SUFDTiwyRUFVTTtJQUNSLGlCQUFNOzs7O0lBaEpKLHVHQUFrRiwwRUFBQSwwRkFBQSw4RkFBQSx5REFBQSw0Q0FBQSwwRUFBQSx3SUFBQTtJQU9sRix1RUFBeUQsb0RBQUEsNkNBQUEsOEVBQUEsMEVBQUEscUdBQUE7SUFTckQsZUFBeUU7SUFBekUsMEZBQXlFO0lBQ25FLGVBQWlCO0lBQWpCLDBDQUFpQjtJQVVELGVBQWtCO0lBQWxCLCtDQUFrQjtJQTBHdEMsZUFBc0M7SUFBdEMsbUVBQXNDOzs7O0lBbUJsRCxxQ0FDNEc7SUFBbkUsdUtBQVMsZUFBQSxvREFBMkMsQ0FBQSxJQUFDO0lBQWMsaUJBQU07OztJQUVwSCxnQ0FDbUY7SUFDakYseUNBQXdFO0lBQzFFLGlCQUFNOztJQURlLGVBQWdDO0lBQWhDLDhDQUFnQzs7Ozs7O0lBM1MvQywrQkFDOEYsZ0JBQUE7SUFHdEIsa0tBQVUsZUFBQSxrQ0FBMEIsQ0FBQSxJQUFDO0lBRjNHLGlCQUU4RztJQUM5Ryw0QkFBbUM7SUFDckMsaUJBQU07OztJQUhGLGVBQTBDO0lBQTFDLCtEQUEwQztJQURDLGtFQUFpRCwwRUFBQTs7OztJQVVoRywrQkFFK0c7SUFEaEUscU5BQVMsZUFBQSwrQkFBbUIsQ0FBQSxJQUFDO0lBRTFFLDRCQUFNO0lBQUEsWUFBaUI7SUFBQSxpQkFBTztJQUM5QiwyQkFDa0k7SUFDcEksaUJBQU07Ozs7SUFKSix5Q0FBdUI7SUFBaUMsMEVBQW9EO0lBQ3RHLGVBQWlCO0lBQWpCLHVDQUFpQjtJQUVyQixlQUF3SDtJQUF4SCxnS0FBd0g7SUFEL0UsMkZBQWlFOzs7SUFHOUcsK0JBQzJELFdBQUE7SUFDbkQsWUFBaUI7SUFBQSxpQkFBTztJQUM5QiwyQkFDa0k7SUFDcEksaUJBQU07Ozs7SUFKZ0IseUNBQXVCO0lBQ3JDLGVBQWlCO0lBQWpCLHVDQUFpQjtJQUVyQixlQUF3SDtJQUF4SCxnS0FBd0g7SUFEL0UsMkZBQWlFOzs7SUFHOUcsMEJBQ007Ozs7SUFDTix1Q0FHK0Q7SUFGbEIsNk9BQVcsZUFBQSw2Q0FBaUMsQ0FBQSxJQUFDLG9MQUU1RSxlQUFBLGdDQUF3QixDQUFBLElBRm9EO0lBRTNCLGlCQUFjOztJQUhoRSxpQ0FBbUIsK0JBQUEsMkJBQUE7OztJQW5CbEMsK0JBR3VGO0lBQ3JGLDBFQU1NO0lBQ04sMEVBS007SUFDTiwwRUFDTTtJQUNOLDBGQUc2RTtJQUMvRSxpQkFBTTs7Ozs7SUFyQkoseUhBQThGO0lBRDlGLHdFQUFtQztJQUQyQix5Q0FBMkIsaUNBQUEsOEJBQUE7SUFJbkYsZUFBK0Q7SUFBL0QsaUdBQStEO0lBTy9ELGVBQWtFO0lBQWxFLG9HQUFrRTtJQU1sRSxlQUFpQjtJQUFqQix5Q0FBaUI7SUFFVyxlQUFxRDtJQUFyRCw0RkFBcUQ7OztJQW1CekYsd0NBQ29COzs7SUFENkMsZ0RBQTBCOzs7SUFGN0YsbUNBQ21FO0lBQ2pFLHVHQUNvQjtJQUNwQiwrQkFBdUQ7SUFBQSxzQkFBTTtJQUFBLGlCQUFNO0lBQ25FLCtCQUE0QztJQUFBLFlBQXlCO0lBQUEsaUJBQU0sRUFBQTs7O0lBSHZELGVBQTJDO0lBQTNDLDBFQUEyQztJQUduQixlQUF5QjtJQUF6QixrREFBeUI7OztJQWdCM0QsK0JBQXdFO0lBQ3RFLDRCQUFrRSxnQkFBQTtJQUVwRSxpQkFBTTs7OztJQUZtQixlQUF3QztJQUF4QyxrRUFBd0M7OztJQVVuRSwrQkFBZ0c7SUFDOUYsWUFBb0Q7SUFBQSxpQkFBTTs7OztJQUExRCxlQUFvRDtJQUFwRCw0RkFBb0Q7OztJQUdwRCwyQkFFTzs7OztJQURMLHNKQUFvSTs7O0lBRXRJLDRCQUF3QztJQUN0QyxZQUNGO0lBQUEsaUJBQU87OztJQURMLGVBQ0Y7SUFERSxzREFDRjs7O0lBQ0EsNEJBQXVDO0lBQ3JDLHFEQUNpQztJQUNuQyxpQkFBTzs7OztJQUYyQixlQUFxQztJQUFyQyxzREFBcUMsK0JBQUE7Ozs7SUFUekUsK0JBQzJDO0lBQXpDLG1PQUFTLGVBQUEsMENBQThCLENBQUEsSUFBQztJQUN4Qyx5RkFFTztJQUNQLHlGQUVPO0lBQ1AseUZBR087SUFDVCxpQkFBTTs7O0lBVkcsZUFBb0I7SUFBcEIsNkNBQW9CO0lBR3BCLGVBQStCO0lBQS9CLG1EQUErQjtJQUcvQixlQUE4QjtJQUE5QixrREFBOEI7Ozs7SUFLdkMsK0JBR3dGLGVBQUE7SUFHcEYsME9BQVMsZUFBQSxpREFBcUMsQ0FBQSxJQUFDO0lBR2pELGlCQUFPO0lBQ1AsMkJBQXlEO0lBQzNELGlCQUFNOzs7O0lBVDRCLDZGQUEyRCx1R0FBQTtJQUt6RixlQUFvSDtJQUFwSCxzSEFBb0g7SUFGcEgsa0ZBQWdFLHNMQUFBOzs7SUFPcEUsK0JBQzhGO0lBQzVGLHdDQUNvQixlQUFBO0lBRXRCLGlCQUFNOzs7SUFKNEIsNkZBQTJEO0lBQ3JELGVBQWU7SUFBZiw2QkFBZSxpQ0FBQTs7OztJQUl2RCwrQkFFMEUsY0FBQSxnQkFBQTtJQUdwRSx1T0FBVSxlQUFBLCtDQUFtQyxDQUFBLElBQUM7SUFEaEQsaUJBQ21EO0lBQ25ELDRCQUFtQztJQUNyQyxpQkFBTSxFQUFBOzs7O0lBSG1CLGVBQXdDO0lBQXhDLGtFQUF3Qzs7O0lBTWpFLCtCQUM0RTtJQUMxRSxZQUNGO0lBQUEsaUJBQU07Ozs7O0lBRm1CLG1FQUFrRDtJQUN6RSxlQUNGO0lBREUsaUlBQ0Y7OztJQUtFLHFEQUVpQzs7Ozs7O0lBRC9CLGtEQUFnQywrQkFBQSwwQkFBQTs7O0lBTHBDLCtCQUd5QjtJQUN2Qiw0SkFFaUM7SUFDbkMsaUJBQU07Ozs7SUFMSixtRUFBa0QscURBQUE7SUFFakIsZUFBb0M7SUFBcEMseURBQW9DOzs7SUFUekUsNkJBQWdDO0lBQzlCLGdHQUdNO0lBQ04sZ0dBT007SUFDUiwwQkFBZTs7Ozs7SUFaUCxlQUFpRjtJQUFqRixvSEFBaUY7SUFLcEYsZUFBcUc7SUFBckcsNElBQXFHOzs7SUFyRDVHLCtCQUlpRTtJQUMvRCxpRkFDNEQ7SUFDNUQsaUZBWU07SUFDTixrRkFXTTtJQUNOLGlGQUtNO0lBQ04saUZBUU07SUFDTixtR0FhZTtJQUNqQixpQkFBTTs7Ozs7O0lBMURKLDRGQUFpRTtJQUZqRSxpS0FBc0oscUVBQUE7SUFHdEosb0ZBQThEO0lBQ0MsZUFBK0I7SUFBL0IsNERBQStCO0lBRXhGLGVBQTBFO0lBQTFFLCtHQUEwRTtJQWM3RSxlQUFvRztJQUFwRyw2SUFBb0c7SUFXakcsZUFBbUc7SUFBbkcsNElBQW1HO0lBT3RHLGVBQWlIO0lBQWpILHdLQUFpSDtJQVFyRyxlQUFlO0lBQWYsd0NBQWU7OztJQS9EcEMsK0JBTXFELGNBQUEsY0FBQSxjQUFBO0lBSTdDLDJFQUdNO0lBQ1IsaUJBQU0sRUFBQTtJQUVSLDRFQTZETTtJQUNSLGlCQUFNLEVBQUE7Ozs7SUE1RU4sc0dBQWtGLHFJQUFBLHlGQUFBLDZGQUFBLHdEQUFBO0lBUXRFLGVBQWlCO0lBQWpCLHlDQUFpQjtJQU1ILGVBQWtCO0lBQWxCLDhDQUFrQjs7OztJQXdGeEMsK0JBQ3FELGNBQUEsZ0JBQUE7SUFJTixnT0FBVSxlQUFBLCtDQUFtQyxDQUFBLElBQUM7SUFGekYsaUJBRTRGO0lBQzVGLDRCQUFtQztJQUNyQyxpQkFBTSxFQUFBOzs7O0lBTk4sbUVBQWtEO0lBSTlDLGVBQXdDO0lBQXhDLGtFQUF3QztJQUZuQiwyRkFBaUUsMkVBQUE7OztJQWE1RiwrQkFBZ0c7SUFDOUYsWUFBb0Q7SUFBQSxpQkFBTTs7OztJQUExRCxlQUFvRDtJQUFwRCw0RkFBb0Q7OztJQUdwRCwyQkFFTzs7OztJQURMLHNKQUFvSTs7O0lBRXRJLDRCQUF3QztJQUN0QyxZQUNGO0lBQUEsaUJBQU87OztJQURMLGVBQ0Y7SUFERSxzREFDRjs7O0lBQ0EsNEJBQXVDO0lBQ3JDLHFEQUNpQztJQUNuQyxpQkFBTzs7OztJQUYyQixlQUFxQztJQUFyQyx1REFBcUMsK0JBQUE7Ozs7SUFUekUsK0JBQ3lGO0lBQXZGLHFPQUFTLGVBQUEsMkNBQThCLENBQUEsSUFBQztJQUN4Qyx5RkFFTztJQUNQLHlGQUVPO0lBQ1AseUZBR087SUFDVCxpQkFBTTs7Ozs7SUFYcUMsMkVBQTZDO0lBQy9FLGVBQW9CO0lBQXBCLDZDQUFvQjtJQUdwQixlQUErQjtJQUEvQixtREFBK0I7SUFHL0IsZUFBOEI7SUFBOUIsa0RBQThCOzs7O0lBS3ZDLCtCQUd3RixlQUFBO0lBR3BGLDRPQUFTLGVBQUEsa0RBQXFDLENBQUEsSUFBQztJQUdqRCxpQkFBTztJQUNQLDJCQUF5RDtJQUMzRCxpQkFBTTs7OztJQVQ0Qiw2RkFBMkQsdUdBQUE7SUFLekYsZUFBb0g7SUFBcEgsc0hBQW9IO0lBRnBILGtGQUFnRSxzTEFBQTs7O0lBT3BFLCtCQUM4RjtJQUM1Rix3Q0FDb0IsZUFBQTtJQUV0QixpQkFBTTs7O0lBSjRCLDZGQUEyRDtJQUNyRCxlQUFlO0lBQWYsNkJBQWUsaUNBQUE7Ozs7SUFJdkQsK0JBRTBFLGNBQUEsZ0JBQUE7SUFJM0IseU9BQVUsZUFBQSxnREFBbUMsQ0FBQSxJQUFDO0lBRnpGLGlCQUU0RjtJQUM1Riw0QkFBbUM7SUFDckMsaUJBQU0sRUFBQTs7OztJQUZGLGVBQXdDO0lBQXhDLGtFQUF3QztJQUZuQiwyRkFBaUUsMkVBQUE7OztJQU8xRiwrQkFHdUQ7SUFDckQsWUFBMkU7SUFBQSxpQkFBTTs7Ozs7SUFIMUQsb0VBQWtEO0lBQ3pFLDRFQUE2QyxzRUFBQTtJQUU3QyxlQUEyRTtJQUEzRSxpSUFBMkU7OztJQU0zRSxxREFFaUM7Ozs7OztJQUQvQixrREFBZ0MsK0JBQUEsMEJBQUE7OztJQU5wQywrQkFJdUQ7SUFDckQsNEpBRWlDO0lBQ25DLGlCQUFNOzs7OztJQU5tQixvRUFBa0Qsc0RBQUE7SUFDdEIsNEVBQTZDLHNFQUFBO0lBRS9ELGVBQW9DO0lBQXBDLHlEQUFvQzs7O0lBWHpFLDZCQUFnQztJQUM5QixnR0FJbUY7SUFDbkYsZ0dBUU07SUFDUiwwQkFBZTs7Ozs7SUFkUCxlQUFpRjtJQUFqRixvSEFBaUY7SUFNcEYsZUFBcUc7SUFBckcsNElBQXFHOzs7SUFVeEcsK0JBRXVEO0lBQ3JELFlBQW1GO0lBQUEsaUJBQU07Ozs7O0lBRHpGLG1GQUFvRDtJQUNwRCxlQUFtRjtJQUFuRix5SUFBbUY7OztJQUtuRixxREFFaUM7Ozs7OztJQUZzQywrQ0FBNkIseUNBQUEsdUNBQUEsMEJBQUE7OztJQUp0RywrQkFHdUQ7SUFDckQsNEpBRWlDO0lBQ25DLGlCQUFNOzs7OztJQUpKLG1GQUFvRDtJQUNuQixlQUFvQztJQUFwQyx5REFBb0M7OztJQVR6RSw2QkFBMkQ7SUFDekQsZ0dBRzJGO0lBQzNGLGdHQU9NO0lBQ1IsMEJBQWU7Ozs7O0lBWlAsZUFBcUY7SUFBckYsd0hBQXFGO0lBS3hGLGVBQXlHO0lBQXpHLGdKQUF5Rzs7O0lBVTFHLCtCQUV1RDtJQUNyRCxZQUFtRjtJQUFBLGlCQUFNOzs7OztJQUR6RixtRkFBb0Q7SUFDcEQsZUFBbUY7SUFBbkYseUlBQW1GOzs7SUFLbkYscURBRWlDOzs7Ozs7SUFEL0Isc0RBQW9DLHVDQUFBLDBCQUFBOzs7SUFMeEMsK0JBR3VEO0lBQ3JELDJLQUVpQztJQUNuQyxpQkFBTTs7Ozs7SUFKSixtRkFBb0Q7SUFDbkIsZUFBb0M7SUFBcEMseURBQW9DOzs7SUFUekUsNkJBQXVEO0lBQ3JELCtHQUcyRjtJQUMzRiwrR0FPTTtJQUNSLDBCQUFlOzs7OztJQVpQLGVBQXFGO0lBQXJGLHlIQUFxRjtJQUt4RixlQUF5RztJQUF6RyxpSkFBeUc7Ozs7SUFVNUcsMERBSTBFO0lBRHhFLDJYQUFtQixlQUFBLG1GQUFrRSxDQUFBLElBQUMsOFBBQ3ZFLGVBQUEsaUVBQXVELENBQUEsSUFEZ0I7SUFFeEYsaUJBQWlDOzs7Ozs7SUFKL0Isc0RBQW9DLDJCQUFBLHVDQUFBLDBCQUFBLGtDQUFBOzs7SUFIeEMsK0JBQ3VEO0lBQ3JELDRKQUtpQztJQUNuQyxpQkFBTTs7Ozs7SUFQSixtRkFBb0Q7SUFDbkIsZUFBb0M7SUFBcEMseURBQW9DOzs7SUFqQnpFLDZCQUEwRDtJQUN4RCxrSEFhZTtJQUNmLGdHQVFNO0lBQ1IsMEJBQWU7Ozs7SUF2QkUsZUFBc0M7SUFBdEMsbUVBQXNDO0lBYy9DLGVBQXFDO0lBQXJDLGtFQUFxQzs7O0lBOUYvQywrQkFLaUU7SUFDL0QsaUZBQzREO0lBQzVELGlGQVlNO0lBQ04sa0ZBV007SUFDTixpRkFLTTtJQUNOLGlGQVNNO0lBQ04sbUdBZWU7SUFDZixtR0FhZTtJQUNmLG1HQXdCZTtJQUNqQixpQkFBTTs7Ozs7O0lBckdKLDRGQUFpRTtJQUZqRSxpS0FBc0oscUVBQUE7SUFHdEksMkRBQTJDLHNFQUFBO0lBRUksZUFBK0I7SUFBL0IsNERBQStCO0lBRXhGLGVBQTBFO0lBQTFFLCtHQUEwRTtJQWM3RSxlQUFvRztJQUFwRyw2SUFBb0c7SUFXakcsZUFBbUc7SUFBbkcsNElBQW1HO0lBT3RHLGVBQWlIO0lBQWpILHdLQUFpSDtJQVNyRyxlQUFlO0lBQWYsd0NBQWU7SUFnQmYsZUFBMEM7SUFBMUMsdUVBQTBDO0lBYzFDLGVBQXlDO0lBQXpDLHNFQUF5Qzs7O0lBZ0N0RCwyQkFBd0U7SUFDdEUsNENBQWtGO0lBQ3BGLGlCQUFNOzs7SUFEa0IsZUFBb0M7SUFBcEMsdURBQW9DOzs7SUFObEUsK0JBQStFLGNBQUEsY0FBQTtJQUt6RSxpRkFFTTtJQUNSLGlCQUFNLEVBQUEsRUFBQTs7OztJQU5OLGVBQTBFO0lBQTFFLDBGQUEwRSxzRUFBQTtJQUdsQyxlQUFnQztJQUFoQywyREFBZ0M7Ozs7SUE5STlFLCtCQWlCMEY7SUFoQnhGLDJLQUFXLGVBQUEsc0NBQTZCLENBQUEsSUFBQywwSkFBVSxlQUFBLG9DQUEyQixDQUFBLElBQXJDLDBPQUMxQixpREFBeUIsNkNBQWdDLEdBQUcsSUFBSSxDQUFBLElBRHRDLDhOQUVoQyxlQUFBLDZDQUFnQyxDQUFBLElBRkEsb09BVTZCLGVBQUEsaURBQW1DLENBQUEsSUFWaEUsOE5BV2hDLGVBQUEsdURBQTBDLENBQUEsSUFYVixrT0FXdUIsZUFBQSx1REFBMEMsQ0FBQSxJQVhqRSxvT0FZN0IsZUFBQSx1REFBMEMsQ0FBQSxJQVpiLGtPQWMzQixlQUFBLGlEQUFvQyxDQUFBLElBZFQsa09BY3lCLGVBQUEsbURBQXNDLENBQUEsSUFkL0Q7SUFpQnpDLCtCQUFxRCxjQUFBO0lBR2pELDJFQVFNO0lBQ1IsaUJBQU07SUFDTiw0RUF3R007SUFDUixpQkFBTTtJQUNOLDJFQVVNO0lBQ1IsaUJBQU07Ozs7SUFoSkosdUdBQWtGLDBFQUFBLDBGQUFBLDhGQUFBLHlEQUFBLDRDQUFBLDBFQUFBLHdJQUFBO0lBT2xGLHVFQUF5RCxvREFBQSw2Q0FBQSw4RUFBQSwwRUFBQSxxR0FBQTtJQVNyRCxlQUF5RTtJQUF6RSwwRkFBeUU7SUFDbkUsZUFBaUI7SUFBakIsMENBQWlCO0lBVUQsZUFBa0I7SUFBbEIsK0NBQWtCO0lBMEd0QyxlQUFzQztJQUF0QyxtRUFBc0M7Ozs7SUFtQmxELHFDQUM0RztJQUFuRSx1S0FBUyxlQUFBLG9EQUEyQyxDQUFBLElBQUM7SUFBYyxpQkFBTTs7O0lBRXBILGdDQUNtRjtJQUNqRix5Q0FBd0U7SUFDMUUsaUJBQU07O0lBRGUsZUFBZ0M7SUFBaEMsOENBQWdDOztBRGxRdkQ7O0dBRUc7QUFLSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsbUJBQW1CO0lBMCtCdkQsWUFBWSxRQUFrQjtRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFoK0JaLDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUMvQiwwQkFBcUIsR0FBMEI7WUFDbkQsVUFBVSxFQUFFLEVBQUU7WUFDZCxZQUFZLEVBQUUsRUFBRTtZQUNoQixZQUFZLEVBQUUsRUFBRTtTQUNuQixDQUFDO1FBRU0sd0JBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLDRCQUF1QixHQUFHLEdBQUcsQ0FBQztRQUM5QixxQ0FBZ0MsR0FBRyxNQUFNLENBQUM7UUFDMUMsMEJBQXFCLEdBQUcsR0FBRyxDQUFDO1FBQzVCLHNDQUFpQyxHQUFHLEdBQUcsQ0FBQztRQUN4QyxnQ0FBMkIsR0FBRyxHQUFHLENBQUM7UUFFbEMsaUNBQTRCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLCtCQUEwQixHQUFtQixFQUFFLENBQUM7UUFnQmhELDBCQUFxQixHQUE0QixFQUFFLENBQUM7UUFDcEQsc0JBQWlCLEdBQXdCLEVBQUUsQ0FBQztRQUU1QyxzQ0FBaUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUl2QywwQkFBcUIsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFHL0MsNEJBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0Isb0NBQStCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckMsMkJBQXNCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsNkJBQXdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFOUIsaUNBQTRCLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLHlDQUFvQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTFDLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QiwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDL0IsOENBQXlDLEdBQUcsS0FBSyxDQUFDO1FBR2xELGNBQVMsR0FBK0MsRUFBRSxDQUFDO1FBRTNELHFCQUFnQixHQUErQixFQUFFLENBQUM7UUFDbEQsa0NBQTZCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFbkMsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLGdDQUEyQixHQUFHLENBQUMsQ0FBQztRQUNoQyx5QkFBb0IsR0FBRyxlQUFlLENBQUMsb0JBQW9CLENBQUM7UUFPN0QsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixrQ0FBNkIsR0FBRyxJQUFJLDZCQUE2QixFQUFFLENBQUM7UUFFcEUsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRS9COztXQUVHO1FBQ0ksb0NBQStCLEdBQUcsS0FBSyxDQUFDO1FBNkM5QixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUU5RTs7V0FFRztRQUVJLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFFL0Q7O1dBRUc7UUFDYywwQ0FBcUMsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQVMzRixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO1FBUzlELHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFvQyxDQUFDO1FBU3hFLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUE4RCxDQUFDO1FBMkM1RyxrQkFBYSxHQUF3QixFQUFFLENBQUM7UUFFL0M7O1dBRUc7UUFFSSx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBUXREOztXQUVHO1FBRUksMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBaUJ0Qzs7V0FFRztRQUVJLDRCQUF1QixHQUFHLElBQUksQ0FBQztRQVF0Qzs7VUFFRTtRQUVLLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUVwQzs7V0FFRztRQUVJLG9CQUFlLEdBQXlDLElBQUksWUFBWSxFQUEwQixDQUFDO1FBVXpGLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQThCLENBQUM7UUFVOUQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBOEIsQ0FBQztRQVUvRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO1FBYy9FOztXQUVHO1FBRUksc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBaUJoQzs7O1dBR0c7UUFFSSx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFFbEM7Ozs7V0FJRztRQUVJLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQXdYOUIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTdDOztXQUVHO1FBQ0ksaUJBQVksR0FBUSxpQkFBaUIsQ0FBQztRQUU3Qzs7V0FFRztRQUNJLHlCQUFvQixHQUFRLHlCQUF5QixDQUFDO1FBd0Y1QyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUc5QyxpQkFBWSxHQUEyQyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQVUxRixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO1FBVTlELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUEyQ2pGOztXQUVHO1FBRUksZUFBVSxHQUFHLElBQUksQ0FBQztRQTBCekI7O1dBRUc7UUFFSSxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXZCOztXQUVHO1FBRUksd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBRWxDOztXQUVHO1FBRUksbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFFN0I7O1dBRUc7UUFFSSxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXRCOzs7V0FHRztRQUVJLGlDQUE0QixHQUFHLElBQUksQ0FBQztRQUUzQzs7V0FFRztRQUVJLHlDQUFvQyxHQUFHLElBQUksQ0FBQztRQUVuRDs7V0FFRztRQUVJLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFekI7O1dBRUc7UUFFSSw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFFdkM7O1dBRUc7UUFFSSxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRXpCOzs7V0FHRztRQUVJLHVCQUFrQixHQUFHLElBQUksQ0FBQztRQUVqQzs7V0FFRztRQUVJLCtCQUEwQixHQUFHLElBQUksQ0FBQztRQUdsQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUVyQixpQkFBWSxHQUFrQixFQUFFLENBQUM7UUFFbEMsc0JBQWlCLEdBQWlDLEVBQUUsQ0FBQztRQUVyRCw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFXbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBNStCRDs7T0FFRztJQUNILElBQWMsYUFBYTtRQUN2QixPQUFPLG9CQUFvQixDQUFDO0lBQ2hDLENBQUM7SUFxSEQ7O09BRUc7SUFDSCwrREFBK0Q7SUFDL0QsSUFBcUIsa0JBQWtCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFjRDs7T0FFRztJQUNILCtEQUErRDtJQUMvRCxJQUFxQixhQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBR0Q7O09BRUc7SUFDSCwrREFBK0Q7SUFDL0QsSUFBcUIsb0JBQW9CO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFHRDs7T0FFRztJQUNILCtEQUErRDtJQUMvRCxJQUFxQixxQkFBcUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUdEOztPQUVHO0lBQ0gsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUNXLE9BQU8sQ0FBQyxLQUEwQztRQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQVdEOztPQUVHO0lBQ0gsSUFBVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUE4QjtRQUNuRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQTZERDs7O09BR0c7SUFDSCwrREFBK0Q7SUFDL0QsSUFBcUIsWUFBWTtRQUM3QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQUdEOzs7T0FHRztJQUNILCtEQUErRDtJQUMvRCxJQUFxQixlQUFlO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsK0RBQStEO0lBQy9ELElBQXFCLFlBQVk7UUFDN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFvRkQ7O09BRUc7SUFDSCxJQUNXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDckMsQ0FBQztJQUVELElBQVcsWUFBWSxDQUFDLFlBQWlCO1FBQ3JDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQ2pDLEdBQUcsRUFBRTtnQkFDRCxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxFQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVkLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO29CQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDakM7YUFDSjtZQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQy9DLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUM7UUFDekMsSUFBSSxZQUFZLEVBQUU7WUFDZCxJQUFJLFlBQVksWUFBWSx3QkFBd0IsRUFBRTtnQkFDbEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNsRSxZQUFZLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztvQkFDOUIsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDWixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2xCLFlBQVksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUNuQyxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQzthQUNOO2lCQUFNO2dCQUNILFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3JELFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBRXJELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUN0QyxZQUFZLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUN4RCxZQUFZLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUM1RCxDQUFDLENBQUMsQ0FBQzthQUNOO1NBQ0o7SUFDTCxDQUFDO0lBb0JEOztPQUVHO0lBQ0gsSUFDVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM3RixDQUFDO0lBRUQsSUFBVyxLQUFLLENBQUMsS0FBMEI7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN6QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUNqQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXpCLElBQUksaUNBQWlDLEdBQUcsS0FBSyxDQUFDO1FBRTlDLHlEQUF5RDtRQUN6RCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUM5QixJQUFJLDJCQUFtQyxDQUFDO1lBQ3hDLElBQUksNkJBQTZCLEdBQWEsRUFBRSxDQUFDO1lBRWpELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUN4QixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssMkJBQTJCLENBQUMsUUFBUSxFQUFFO29CQUM3RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO3dCQUN4RCw2QkFBNkIsR0FBRyxFQUFFLENBQUM7d0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0NBQ2pCLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7NkJBQy9FO2lDQUFNO2dDQUNILDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs2QkFDMUU7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7cUJBQ047aUJBQ0o7cUJBQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ25ELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTt3QkFDakIsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ25GO3lCQUFNO3dCQUNILDJCQUEyQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQzlFO2lCQUNKO2FBQ0o7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsQyxPQUF5Qjt3QkFDckIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUU7d0JBQ3JCLE9BQU8sRUFBRSxJQUFJO3dCQUNiLGdCQUFnQixFQUFFLEVBQUU7cUJBQ3ZCLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQUM7YUFDTjtZQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDWixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQ3hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7b0JBRTVCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7d0JBQzdELElBQUksNkJBQTZCLENBQUMsTUFBTSxFQUFFOzRCQUN0QyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0NBQ2pCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUUzQyxPQUFPLGNBQWMsQ0FBQyxNQUFNLEVBQUU7b0NBQzFCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDdEMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0NBRTVCLE1BQU0sS0FBSyxHQUFHLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0NBQ3BHLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dDQUNkLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dDQUN0RCw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FDQUNsRDt5Q0FBTTt3Q0FDSCxpQ0FBaUMsR0FBRyxJQUFJLENBQUM7cUNBQzVDO29DQUNELElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLEVBQUU7d0NBQ3ZDLE1BQU07cUNBQ1Q7b0NBRUQsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFO3dDQUN0QixXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTs0Q0FDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7NENBQzFCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0NBQzlCLENBQUMsQ0FBQyxDQUFDO3FDQUNOO2lDQUNKOzZCQUNKO2lDQUFNO2dDQUNILEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQ0FDM0IsTUFBTSxLQUFLLEdBQUcsNkJBQTZCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29DQUN4RixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTt3Q0FDZCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3Q0FDMUIsNkJBQTZCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztxQ0FDbEQ7eUNBQU07d0NBQ0gsaUNBQWlDLEdBQUcsSUFBSSxDQUFDO3FDQUM1QztvQ0FDRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxFQUFFO3dDQUN2QyxNQUFNO3FDQUNUO2lDQUNKOzZCQUNKO3lCQUNKO3FCQUNKO3lCQUFNO3dCQUNILGlDQUFpQyxHQUFHLElBQUksQ0FBQzt3QkFDekMsSUFBSSwyQkFBMkIsRUFBRTs0QkFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dDQUNqQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDM0MsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFO29DQUMxQixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7b0NBQ3RDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29DQUU1QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssMkJBQTJCLEVBQUU7d0NBQ2hGLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO3dDQUM3Qiw4RkFBOEY7d0NBQzlGLGlDQUFpQyxHQUFHLEtBQUssQ0FBQzt3Q0FDMUMsTUFBTTtxQ0FDVDtvQ0FFRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUU7d0NBQ3RCLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFOzRDQUNoQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dDQUM5QixDQUFDLENBQUMsQ0FBQztxQ0FDTjtpQ0FDSjs2QkFDSjtpQ0FBTTtnQ0FDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQ0FDdEIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEtBQUssMkJBQTJCLEVBQUU7d0NBQ3BFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO3dDQUN0Qiw4RkFBOEY7d0NBQzlGLGlDQUFpQyxHQUFHLEtBQUssQ0FBQztxQ0FDN0M7Z0NBQ0wsQ0FBQyxDQUFDLENBQUM7NkJBQ047eUJBQ0o7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLHVCQUEwQyxDQUFDO1lBQy9DLElBQUksd0JBQXdCLEdBQXdCLEVBQUUsQ0FBQztZQUV2RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDeEIsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLDJCQUEyQixDQUFDLFFBQVEsRUFBRTtvQkFDN0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTt3QkFDeEQsd0JBQXdCLEdBQUcsRUFBRSxDQUFDO3dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dDQUNqQix3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUM1QztpQ0FBTTtnQ0FDSCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7NkJBQ3ZDO3dCQUNMLENBQUMsQ0FBQyxDQUFDO3FCQUNOO2lCQUNKO3FCQUFNO29CQUNILElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO3dCQUM1QyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7NEJBQ2pCLHVCQUF1QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO3lCQUNqRDs2QkFBTTs0QkFDSCx1QkFBdUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO3lCQUM1QztxQkFDSjtpQkFDSjthQUNKO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbEMsT0FBeUI7d0JBQ3JCLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFO3dCQUNyQixPQUFPLEVBQUUsSUFBSTt3QkFDYixnQkFBZ0IsRUFBRSxFQUFFO3FCQUN2QixDQUFDO2dCQUNOLENBQUMsQ0FBQyxDQUFDO2FBQ047WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1osSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7b0JBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7b0JBRTVCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7d0JBQzdELElBQUksd0JBQXdCLENBQUMsTUFBTSxFQUFFOzRCQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0NBQ2pCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUVuRCxPQUFPLGNBQWMsQ0FBQyxNQUFNLEVBQUU7b0NBQzFCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDdEMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0NBRTVCLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7b0NBQ2pFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dDQUNkLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dDQUN0RCx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FDQUM3Qzt5Q0FBTTt3Q0FDSCxpQ0FBaUMsR0FBRyxJQUFJLENBQUM7cUNBQzVDO29DQUNELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUU7d0NBQ2xDLE1BQU07cUNBQ1Q7b0NBRUQsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFO3dDQUN0QixXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTs0Q0FDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7NENBQzFCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0NBQzlCLENBQUMsQ0FBQyxDQUFDO3FDQUNOO2lDQUNKOzZCQUNKO2lDQUFNO2dDQUNILEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQ0FDM0IsTUFBTSxLQUFLLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29DQUNyRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTt3Q0FDZCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3Q0FDMUIsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztxQ0FDN0M7eUNBQU07d0NBQ0gsaUNBQWlDLEdBQUcsSUFBSSxDQUFDO3FDQUM1QztvQ0FDRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFO3dDQUNsQyxNQUFNO3FDQUNUO2lDQUNKOzZCQUNKO3lCQUNKO3FCQUNKO3lCQUFNO3dCQUNILGlDQUFpQyxHQUFHLElBQUksQ0FBQzt3QkFDekMsSUFBSSx1QkFBdUIsRUFBRTs0QkFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dDQUNqQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDM0MsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFO29DQUMxQixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7b0NBQ3RDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29DQUU1QixJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssdUJBQXVCLEVBQUU7d0NBQzlDLDhGQUE4Rjt3Q0FDOUYsaUNBQWlDLEdBQUcsS0FBSyxDQUFDO3dDQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQzt3Q0FDN0IsTUFBTTtxQ0FDVDtvQ0FFRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUU7d0NBQ3RCLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFOzRDQUNoQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dDQUM5QixDQUFDLENBQUMsQ0FBQztxQ0FDTjtpQ0FDSjs2QkFDSjtpQ0FBTTtnQ0FDSCxpQ0FBaUMsR0FBRyxJQUFJLENBQUM7Z0NBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29DQUN0QixJQUFJLElBQUksS0FBSyx1QkFBdUIsRUFBRTt3Q0FDbEMsOEZBQThGO3dDQUM5RixpQ0FBaUMsR0FBRyxLQUFLLENBQUM7d0NBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO3FDQUN6QjtnQ0FDTCxDQUFDLENBQUMsQ0FBQzs2QkFDTjt5QkFDSjtxQkFDSjtpQkFDSjthQUNKO1NBQ0o7UUFFRCxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUVsQyxJQUFJLGlDQUFpQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQWVEOztPQUVHO0lBQ0gsSUFDVyxTQUFTO1FBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7WUFDN0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7U0FDcEc7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQVcsU0FBUyxDQUFDLFNBQWtEO1FBQ25FLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7WUFDN0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNmLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdHO2lCQUFNO2dCQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLElBQUksRUFBRSxDQUFDO2dCQUV6QyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUM5QixJQUFJLENBQUMsdUJBQXVCLENBQ3hCLElBQUksRUFDSixLQUFLLEVBQ0wsSUFBSSxFQUNKLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUNsQyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQzVELENBQUMsQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7U0FDSjthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNmLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3JFO2lCQUFNO2dCQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN6RDtTQUNKO1FBRUQsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELElBQ1csYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsSUFBVyxhQUFhLENBQUMsS0FBMkM7UUFDaEUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUVuQywrREFBK0Q7UUFDL0QsbUhBQW1IO1FBQ25ILDhGQUE4RjtRQUM5Rix5R0FBeUc7UUFDekcsb0RBQW9EO1FBQ3BELDhHQUE4RztRQUM5RyxvQ0FBb0M7UUFDcEMsaURBQWlEO1FBQ2pELElBQUksS0FBSyxLQUFLLDJCQUEyQixDQUFDLFFBQVEsRUFBRTtZQUNoRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDMUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0RDtTQUNKO0lBQ0wsQ0FBQztJQVFEOzs7OztPQUtHO0lBQ0gsK0RBQStEO0lBQy9ELElBQXFCLFFBQVE7UUFDekIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFNRDs7O09BR0c7SUFDSCwrREFBK0Q7SUFDL0QsSUFBcUIsV0FBVztRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUdEOzs7T0FHRztJQUNILCtEQUErRDtJQUMvRCxJQUFxQixhQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBR0Q7O09BRUc7SUFDSCxJQUNXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQVcsV0FBVyxDQUFDLEtBQStCO1FBQ2xELElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFBRTtZQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzdCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN6QjtZQUNELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNqQztTQUNKO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFDVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFXLGFBQWEsQ0FBQyxLQUF3QjtRQUM3QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQWNEOztPQUVHO0lBQ0gsSUFDVyxtQkFBbUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQVcsbUJBQW1CLENBQUMsS0FBYTtRQUN4QyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQ1csY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBVyxjQUFjLENBQUMsS0FBYTtRQUNuQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUE2Rk0sd0JBQXdCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0QsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFFTSxXQUFXO1FBQ2Qsb0ZBQW9GO1FBQ3BGLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFFeEQsK0ZBQStGO1FBQy9GLGdEQUFnRDtJQUNwRCxDQUFDO0lBRU0sUUFBUTtRQUNYLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsRUFBRTtnQkFDbEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQztTQUNMO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDbkU7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMvRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNoRTtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRixtRUFBbUU7WUFDbkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdGLG1HQUFtRztZQUNuRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFL0csSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDbEM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUk7UUFDbkI7Ozs7V0FJRztRQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQzthQUN6RCxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQ2hDLGFBQWEsRUFDYixHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUNULENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7U0FDbkQ7UUFFRCxJQUFJLENBQUMsd0NBQXdDLEVBQUUsQ0FBQztRQUVoRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQixJQUFJLENBQUMsdUNBQXVDO2dCQUN4QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2pHO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFNUIscUdBQXFHO1FBQ3JHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVGLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUN4RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG9CQUFvQixDQUFDLFlBQW1DO1FBQzNELE9BQU8sWUFBWSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLDJCQUEyQixDQUFDLE1BQU07WUFDeEgsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVNLG9CQUFvQixDQUFDLEtBQW9CO1FBQzVDLElBQUksa0NBQWtDLEdBQUcsS0FBSyxDQUFDO1FBRS9DLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFLLE9BQU8sQ0FBQyxTQUFTO2dCQUNsQixrQ0FBa0MsR0FBRyxJQUFJLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTTtZQUNWLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUN2QixLQUFLLE9BQU8sQ0FBQyxPQUFPO2dCQUNoQixrQ0FBa0MsR0FBRyxJQUFJLENBQUM7Z0JBQzFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO2dCQUNqQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLE1BQU0sY0FBYyxHQUFnQixLQUFLLENBQUMsTUFBTSxDQUFDO29CQUNqRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQy9ELFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTtZQUNWLEtBQUssT0FBTyxDQUFDLFVBQVU7Z0JBQ25CLGtDQUFrQyxHQUFHLElBQUksQ0FBQztnQkFDMUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ2pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osTUFBTSxjQUFjLEdBQWdCLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQ2pELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDM0QsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN4QixDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNO1NBQ2I7UUFFRCxJQUFJLGtDQUFrQyxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRU0sbUJBQW1CLENBQUMsS0FBb0I7UUFDM0MsSUFBSSxDQUFDLDZCQUE2QixDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRU8sZUFBZSxDQUFDLFNBQWlCLEVBQUUsV0FBcUI7UUFDNUQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzNCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztTQUNuRTthQUFNLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7WUFDMUgsSUFBSSxJQUFJLEdBQUcsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUM7YUFDcEU7aUJBQU0sSUFBSSxJQUFJLElBQUksU0FBUyxFQUFFO2dCQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQzthQUNoSDtTQUNKO2FBQU07WUFDSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDN0UsSUFBSSxJQUFJLEdBQUcsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUM7YUFDcEU7aUJBQU0sSUFBSSxJQUFJLElBQUksU0FBUyxFQUFFO2dCQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7YUFDM0Q7U0FDSjtRQUNELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxLQUFvQjtRQUM3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDbkUsZUFBZSxDQUFDLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsTUFBTSxhQUFhLEdBQWdCLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDbEgsK0NBQStDO1FBQy9DLDBFQUEwRTtRQUMxRSw0QkFBNEI7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNqQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsNkJBQTZCO2lCQUNsRCw2Q0FBNkMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUN0SCxJQUFJLFlBQVksRUFBRTtnQkFDZCxPQUFPO2FBQ1Y7U0FDSjtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNuRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsT0FBTztTQUNWO1FBQ0QsSUFBSSxrQ0FBa0MsR0FBRyxLQUFLLENBQUM7UUFDL0MsSUFBSSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7UUFFMUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFFbEYsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUNwRSwwREFBMEQ7UUFDMUQsOERBQThEO1FBQzlELG9GQUFvRjtRQUNwRixNQUFNLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFeEMsNkVBQTZFO1FBQzdFLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFLLE9BQU8sQ0FBQyxDQUFDO2dCQUNWLGlDQUFpQztnQkFDakMscUZBQXFGO2dCQUNyRixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7b0JBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUU7d0JBQ25GLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztxQkFDM0I7eUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTsyQkFDcEMsSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7d0JBQ2hFLGtDQUFrQyxHQUFHLElBQUksQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3FCQUNwQjtpQkFDSjtnQkFDRCxNQUFNO1lBQ1YsS0FBSyxPQUFPLENBQUMsSUFBSTtnQkFDYixrQ0FBa0MsR0FBRyxJQUFJLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDL0MsNkJBQTZCLEdBQUcsSUFBSSxDQUFDO2lCQUN4QztnQkFDRCxNQUFNO1lBQ1YsS0FBSyxPQUFPLENBQUMsT0FBTztnQkFDaEIsa0NBQWtDLEdBQUcsSUFBSSxDQUFDO2dCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO29CQUNwQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTt3QkFDL0IsWUFBWTt3QkFDWixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDeEQ7eUJBQU0sSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsQ0FBQyxFQUFFO3dCQUN0RixJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQ2hELDZCQUE2QixHQUFHLElBQUksQ0FBQztxQkFDeEM7eUJBQU07d0JBQ0gsVUFBVSxDQUFDLEdBQUcsRUFBRTs0QkFDWixNQUFNLGNBQWMsR0FBZ0IsS0FBSyxDQUFDLE1BQU0sQ0FBQzs0QkFDakQsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxDQUFDOzRCQUNuRSxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQzVCLENBQUMsQ0FBQyxDQUFDO3FCQUNOO2lCQUNKO2dCQUNELE1BQU07WUFDVixLQUFLLE9BQU8sQ0FBQyxTQUFTO2dCQUNsQixrQ0FBa0MsR0FBRyxJQUFJLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7b0JBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO3dCQUMvQixjQUFjO3dCQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUN6RDt5QkFBTTt3QkFDSCx5Q0FBeUM7d0JBQ3pDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO3dCQUNwRSw2QkFBNkIsR0FBRyxJQUFJLENBQUM7cUJBQ3hDO2lCQUNKO2dCQUNELE1BQU07WUFDVixLQUFLLE9BQU8sQ0FBQyxNQUFNO2dCQUNmLGtDQUFrQyxHQUFHLElBQUksQ0FBQztnQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUN2RCw2QkFBNkIsR0FBRyxJQUFJLENBQUM7aUJBQ3hDO2dCQUNELE1BQU07WUFDVixLQUFLLE9BQU8sQ0FBQyxRQUFRO2dCQUNqQixJQUFrQixLQUFLLENBQUMsVUFBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7b0JBQ3JFLGtDQUFrQyxHQUFHLElBQUksQ0FBQztvQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRTt3QkFDcEMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGNBQWMsQ0FBQyxDQUFDO3dCQUNuRCw2QkFBNkIsR0FBRyxJQUFJLENBQUM7cUJBQ3hDO2lCQUNKO2dCQUNELE1BQU07WUFDVixLQUFLLE9BQU8sQ0FBQyxHQUFHO2dCQUNaLGtDQUFrQyxHQUFHLElBQUksQ0FBQztnQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUM5Qyw2QkFBNkIsR0FBRyxJQUFJLENBQUM7aUJBQ3hDO2dCQUNELE1BQU07WUFDVixLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDbkIsS0FBSyxPQUFPLENBQUMsS0FBSztnQkFDZCxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsbUJBQW1CLEVBQ3pGLGNBQWMsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQzFDLE1BQU07WUFDVixLQUFLLE9BQU8sQ0FBQyxTQUFTO2dCQUNsQixrQ0FBa0MsR0FBRyxJQUFJLENBQUM7Z0JBQzFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3BGLE1BQU07WUFDVixLQUFLLE9BQU8sQ0FBQyxVQUFVO2dCQUNuQixrQ0FBa0MsR0FBRyxJQUFJLENBQUM7Z0JBQzFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3JGLE1BQU07U0FDYjtRQUVELElBQUksNkJBQTZCLEVBQUU7WUFDL0IsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO2dCQUNoQixxR0FBcUc7Z0JBQ3JHLHVHQUF1RztnQkFDdkcsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNqQixJQUFJLENBQUMscUNBQXFDLEVBQUUsQ0FBQztpQkFDaEQ7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLE9BQU8sRUFBRTtvQkFDbkMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7aUJBQ2pDO3FCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsU0FBUyxFQUFFO29CQUM1QyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztpQkFDakM7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO2FBQ3JFO1NBQ0o7UUFFRCxJQUFJLGtDQUFrQyxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztZQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLFVBQVUsQ0FDTixHQUFHLEVBQUU7Z0JBQ0QsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztZQUM5QyxDQUFDLEVBQ0QsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDL0M7SUFDTCxDQUFDO0lBRU8scUNBQXFDO1FBQ3pDLHlGQUF5RjtRQUN6RiwrQ0FBK0M7UUFDL0MsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzlELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hFO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSywrQkFBK0IsQ0FBQyxtQkFBMEMsRUFBRSxjQUF1QixFQUN2RyxLQUFvQixFQUFFLGFBQTBCO1FBQ2hELCtDQUErQztRQUMvQywrQ0FBK0M7UUFDL0MsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUMvRixxQkFBcUIsR0FBRyxJQUFJLENBQUM7U0FDaEM7UUFDRCxJQUFJLGtDQUFrQyxHQUFHLEtBQUssQ0FBQztRQUUvQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ3hCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFO2dCQUNqQyw0RUFBNEU7Z0JBQzVFLHNFQUFzRTtnQkFDdEUsbURBQW1EO2dCQUNuRCxxR0FBcUc7Z0JBQ3JHLG9EQUFvRDtnQkFDcEQsSUFBSSxxQkFBcUIsRUFBRTtvQkFDdkIsa0NBQWtDLEdBQUcsSUFBSSxDQUFDO2lCQUM3QzthQUNKO1lBQ0QsMkZBQTJGO1lBQzNGLG9EQUFvRDtTQUN2RDtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMscUNBQXFDLEVBQUUsQ0FBQztZQUM3QyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7U0FDL0U7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssMkJBQTJCLENBQUMsUUFBUSxFQUFFO1lBQzdELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0gsd0RBQXdEO1lBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDO3dCQUNSLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSzt3QkFDckIsT0FBTyxFQUFFLGtEQUFrRDt3QkFDM0QsTUFBTSxFQUFFLDBDQUEwQztxQkFDckQsQ0FBQyxDQUFDO2lCQUNOO3FCQUFNO29CQUNILElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7d0JBQ3BDLElBQUksY0FBYyxFQUFFOzRCQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO3lCQUNsRDs2QkFBTTs0QkFDSCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7eUJBQzNEO3FCQUNKO2lCQUNKO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQzNELGtDQUFrQyxHQUFHLElBQUksQ0FBQztpQkFDN0M7YUFDSjtTQUNKO1FBRUQsT0FBTyxrQ0FBa0MsQ0FBQztJQUM5QyxDQUFDO0lBRU8sK0JBQStCLENBQUMsbUJBQTBDLEVBQUUsYUFBMEIsRUFBRSxVQUFlO1FBQzNILElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMscUNBQXFDLEVBQUUsQ0FBQztZQUM3QyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7U0FDL0U7UUFDRCxJQUFJLG1CQUFtQixDQUFDLElBQUksS0FBSyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUU7WUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNILEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQy9FLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsV0FBVyxFQUFFO3dCQUN0RSxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUMxQyxNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7U0FDSjthQUFNLElBQUksbUJBQW1CLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDLFNBQVMsRUFBRTtZQUN6RSxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMvRSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDLFdBQVcsRUFBRTtvQkFDdEUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDMUMsTUFBTTtpQkFDVDthQUNKO1NBQ0o7YUFBTSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ3hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN6RDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUNqQztTQUNKO2FBQU07WUFDSCxJQUFJLFdBQVcsR0FBRyxHQUFHLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0QsSUFBSSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNySCxJQUFJLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBRXJILElBQUksa0JBQWtCLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsa0JBQWtCLElBQUksQ0FBQyxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM3RixJQUFJLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssa0JBQWtCLEVBQUU7d0JBQ3JFLHFFQUFxRTt3QkFDckUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7K0JBQ3RCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLENBQUMsRUFBRTs0QkFDbkYsa0ZBQWtGOzRCQUNsRixXQUFXLEdBQUcsR0FBRyxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDOzRCQUN2RCxpQkFBaUIsR0FBRyxHQUFHLENBQUMsbUJBQW1CLENBQ3ZDLFdBQVcsRUFDWCxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7NEJBQzVELGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FDeEMsV0FBVyxFQUNYLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzt5QkFDOUQ7NkJBQU07NEJBQ0gsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLENBQUMsQ0FBQzs0QkFDOUMsTUFBTTt5QkFDVDtxQkFDSjtpQkFDSjthQUNKO1lBQ0QsSUFBSSxJQUFJLENBQUMsb0NBQW9DLEtBQUssQ0FBQyxDQUFDO21CQUM3QyxVQUFVLEtBQUssaUJBQWlCLEVBQUU7Z0JBQ3JDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUN2QjtTQUNKO0lBQ0wsQ0FBQztJQUVPLDhCQUE4QixDQUFDLG1CQUEwQyxFQUFFLGFBQTBCLEVBQUUsVUFBZTtRQUMxSCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUM7WUFDN0MsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1NBQy9FO1FBQ0QsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsV0FBVyxFQUFFO1lBQ3BFLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDckQ7aUJBQU07Z0JBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3hELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsV0FBVyxFQUFFO3dCQUN0RSxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUMxQyxNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7U0FDSjthQUFNLElBQUksbUJBQW1CLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDLFNBQVMsRUFBRTtZQUN6RSxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUU7b0JBQ3RFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzFDLE1BQU07aUJBQ1Q7YUFDSjtTQUNKO2FBQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUN4RCxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzNEO2lCQUFNO2dCQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDaEYsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3hELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO3dCQUMzQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMzQyxNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7U0FDSjthQUFNO1lBQ0gsSUFBSSxlQUFlLEdBQUcsR0FBRyxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUNqRCxlQUFlLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQzdFLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUNsRCxlQUFlLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQzVFLElBQUksc0JBQXNCLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsc0JBQXNCLElBQUksQ0FBQyxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNyRyxJQUFJLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssc0JBQXNCLEVBQUU7d0JBQzdFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTyxLQUFLLE9BQU87K0JBQzNDLGVBQWUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFOzRCQUMzRSx1R0FBdUc7NEJBQ3ZHLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQzt5QkFDM0M7NkJBQU07NEJBQ0gsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLENBQUMsQ0FBQzt5QkFDakQ7d0JBQ0QsTUFBTTtxQkFDVDtpQkFDSjthQUNKO1lBQ0QsSUFBSSxlQUFlLEtBQUssVUFBVSxJQUFJLHFCQUFxQixLQUFLLFVBQVUsRUFBRTtnQkFDeEUsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2xEO1lBQ0QsSUFBSSxxQkFBcUIsS0FBSyxVQUFVLEVBQUU7Z0JBQ3RDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUMzQjtTQUNKO0lBQ0wsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFlBQW1DO1FBQzVELE9BQU8sWUFBWSxDQUFDLElBQUksS0FBSyx5QkFBeUIsQ0FBQyxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNqRyxDQUFDO0lBRU0sb0JBQW9CLENBQUMsS0FBaUIsRUFBRSxZQUFtQztRQUM5RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sZ0JBQWdCLEdBQXFCLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDN0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztTQUMzRDtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FDeEIsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDaEcsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDN0csSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsb0NBQW9DLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN4QyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxDQUFDLENBQUM7d0JBQzlDLE1BQU07cUJBQ1Q7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sb0JBQW9CLENBQUMsS0FBSyxFQUFFLFlBQW1DO1FBQ2xFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUNwQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU1RCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUM5QixJQUFJLENBQUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDcEQ7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxJQUFTO1FBQ2xDLElBQUkseUJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxNQUFNLElBQUksR0FBcUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO2dCQUN2Qix5QkFBeUIsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ25FLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO3dCQUMzRCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ25ELGlCQUFpQixHQUFHLElBQUksQ0FBQzt3QkFDekIsTUFBTTtxQkFDVDtpQkFDSjtnQkFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3JFLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO3dCQUM3RCxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3JELE1BQU07cUJBQ1Q7aUJBQ0o7Z0JBRUQsSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUNwQixJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzlEO2dCQUVELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUU5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDN0IsTUFBTTthQUNUO1NBQ0o7UUFFRCxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztJQUVNLG1DQUFtQyxDQUFDLEtBQUs7UUFDNUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2FBQ2hDO1lBQ0QsSUFBSSxDQUFDLHlDQUF5QyxHQUFHLEtBQUssQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSw4QkFBOEIsQ0FBQyxZQUFtQztRQUNyRSxPQUFPO1lBQ0gsUUFBUSxFQUFFLFlBQVksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQ2xFLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsU0FBUztZQUNqRix3QkFBd0IsRUFBRSxZQUFZLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDLFdBQVc7WUFDckYsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO1NBQ25ELENBQUM7SUFDTixDQUFDO0lBRU0sNEJBQTRCO1FBQy9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xCLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQzthQUMvRztpQkFBTTtnQkFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDaEQsTUFBTSxnQkFBZ0IsR0FBcUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakUsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFO3dCQUNqRCxNQUFNLEdBQUcsS0FBSyxDQUFDO3dCQUNmLE1BQU07cUJBQ1Q7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVNLHNCQUFzQixDQUFDLFlBQW1DO1FBQzdELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFFTSx3QkFBd0IsQ0FBQyxZQUFtQztRQUMvRCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQ3RELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFTyxpQ0FBaUM7UUFDckMsSUFBSSw4QkFBOEIsR0FBRyxLQUFLLENBQUM7UUFDM0MsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFO1lBQy9FLDhCQUE4QixHQUFHLElBQUksQ0FBQztTQUN6QztRQUNELE9BQU8sOEJBQThCLENBQUM7SUFDMUMsQ0FBQztJQUVNLDZCQUE2QixDQUFDLFlBQW1DO1FBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sZ0JBQWdCLEdBQXFCLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDN0QsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUU7Z0JBQzNCLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztnQkFFNUIseURBQXlEO2dCQUN6RCxJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztnQkFDakMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDcEQsTUFBTSxrQkFBa0IsR0FBdUIsTUFBTSxDQUFDO29CQUN0RCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7d0JBQ3JCLE1BQU0sY0FBYyxHQUFxQixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQzt3QkFDbEUsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFOzRCQUN6QixJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFO2dDQUM5QixvQkFBb0IsR0FBRyxJQUFJLENBQUM7NkJBQy9CO3lCQUNKO3FCQUNKO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUVILDJFQUEyRTtnQkFDM0UsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztnQkFFaEYsSUFBSSxvQkFBb0IsSUFBSSw4QkFBOEIsRUFBRTtvQkFDeEQsZUFBZSxHQUFHLElBQUksQ0FBQztvQkFDdkIsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDcEQsTUFBTSxrQkFBa0IsR0FBdUIsTUFBTSxDQUFDO3dCQUN0RCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7NEJBQ3JCLE1BQU0sY0FBYyxHQUFxQixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQzs0QkFDbEUsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFO2dDQUN6QixJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxFQUFFLEVBQUU7b0NBQ3ZDLGVBQWUsR0FBRyxLQUFLLENBQUM7aUNBQzNCOzZCQUNKO3lCQUNKO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2dCQUVELElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtvQkFDNUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDeEUsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsRUFBRTt3QkFDbEMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDdkIsQ0FBQyxDQUFDO29CQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztvQkFDbEcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDO29CQUN4QyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7aUJBQ3RCO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxZQUFtQztRQUN4RCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1NBQUU7UUFFbkQsTUFBTSxnQkFBZ0IsR0FBcUIsWUFBWSxDQUFDLElBQUksQ0FBQztRQUM3RCxPQUFPLFlBQVksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLDBCQUEwQixFQUFFO2VBQ3hELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7ZUFDckMsWUFBWSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsd0JBQXdCO2VBQ3BELGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxZQUFZLENBQUMsTUFBZ0M7UUFDaEQsUUFBUSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ3JCLEtBQUssaUJBQWlCLENBQUMsTUFBTTtnQkFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDekYsS0FBSyxpQkFBaUIsQ0FBQyxPQUFPO2dCQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztZQUN4RixLQUFLLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNsQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFFeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLENBQUM7YUFDekM7WUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2YsNEVBQTRFO2dCQUM1RSx5Q0FBeUM7Z0JBQ3pDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7Z0JBQzFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUMzQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO29CQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsV0FBVyxDQUNsQyxHQUFHLEVBQUU7d0JBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFOzRCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0NBQ2pCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDOzRCQUNuQyxDQUFDLENBQUMsQ0FBQzt5QkFDTjtvQkFDTCxDQUFDLEVBQ0QsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxDQUFDO2FBQ047UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBRWhDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7SUFDdkMsQ0FBQztJQUdPLHdCQUF3QjtRQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsaUNBQWlDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwRCxNQUFNLGtCQUFrQixHQUF1QixNQUFNLENBQUM7Z0JBQ3RELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtvQkFDckIsa0JBQWtCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztpQkFDNUM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNkLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixhQUFhLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMzQyxJQUFJLEVBQUUsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsdUNBQXVDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7U0FDbEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUM3QixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDN0M7UUFDRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUM3QixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDN0M7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0I7UUFDckIsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsS0FBaUMsRUFBRSxJQUEyQjtRQUM1RSxJQUFJLGtCQUFrQixHQUFHLDJCQUEyQixDQUFDLE1BQU0sQ0FBQztRQUM1RCxJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDZixrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQyxJQUFJLENBQUM7YUFDekQ7WUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hCLGtCQUFrQixHQUFHLDJCQUEyQixDQUFDLFVBQVUsQ0FBQzthQUMvRDtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFrQixLQUFLLENBQUMsVUFBVyxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7Z0JBQ3ZFLE9BQU87YUFDVjtTQUNKO1FBRUQsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUNwRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsV0FBVyxFQUFFO2dCQUNyRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsRUFBRTtvQkFDOUMsT0FBTztpQkFDVjtnQkFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2pCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7d0JBQzdELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQy9DO3lCQUFNO3dCQUNILElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTs0QkFDckIsSUFBSSxrQkFBa0IsS0FBSywyQkFBMkIsQ0FBQyxNQUFNLEVBQUU7Z0NBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29DQUM3QixJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQ0FDM0QsQ0FBQyxDQUFDLENBQUM7Z0NBRUgsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dDQUN6RixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQ0FDNUMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQzs2QkFDckU7aUNBQU0sSUFBSSxrQkFBa0IsS0FBSywyQkFBMkIsQ0FBQyxJQUFJLEVBQUU7Z0NBQ2hFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDOzZCQUM5RTtpQ0FBTSxJQUFJLGtCQUFrQixLQUFLLDJCQUEyQixDQUFDLFVBQVUsRUFBRTtnQ0FDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dDQUN4RSxJQUFJLENBQUMsNkJBQTZCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQ0FFeEQsSUFBSSxJQUFJLENBQUMsK0JBQStCLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLDZCQUE2QixLQUFLLENBQUMsQ0FBQyxFQUFFO29DQUMxRixJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDO2lDQUM3RTtnQ0FFRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUM7Z0NBQy9DLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0NBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7b0NBQ2pELEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO29DQUNuQixHQUFHLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDO2lDQUM1QztnQ0FDRCxpRUFBaUU7Z0NBQ2pFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQzFCLElBQUksVUFBVSxHQUFxQixJQUFJLENBQUM7Z0NBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0NBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsV0FBVyxFQUFFO3dDQUN0RSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzt3Q0FDNUUsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztxQ0FDbEQ7aUNBQ0o7Z0NBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDdEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7aUNBQ2hGOzZCQUNKOzRCQUNELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3lCQUNyRDtxQkFDSjtpQkFDSjtxQkFBTTtvQkFDSCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssMkJBQTJCLENBQUMsUUFBUSxFQUFFO3dCQUM3RCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7NEJBQ3JCLElBQUksa0JBQWtCLEtBQUssMkJBQTJCLENBQUMsSUFBSSxFQUFFO2dDQUN6RCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ2pDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7NkJBQ3JFO2lDQUFNO2dDQUNILElBQUksa0JBQWtCLEtBQUssMkJBQTJCLENBQUMsVUFBVSxFQUFFO29DQUMvRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7b0NBQ3hFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29DQUV4RCxJQUFJLElBQUksQ0FBQywrQkFBK0IsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsNkJBQTZCLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0NBQzFGLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUM7cUNBQzdFO29DQUVELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztvQ0FDL0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztvQ0FDckIsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsRUFBRTt3Q0FDakQsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7d0NBQ25CLEdBQUcsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUM7cUNBQzVDO29DQUVELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7b0NBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0NBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsV0FBVyxFQUFFOzRDQUN0RSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lDQUNyRDtxQ0FDSjtpQ0FDSjtxQ0FBTTtvQ0FDSCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29DQUM3QixJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO2lDQUNyRTtnQ0FFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzs2QkFDOUM7eUJBQ0o7cUJBQ0o7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzt3QkFDL0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUNsRjtpQkFDSjthQUNKO1lBRUQsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFjLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7YUFDaEM7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQztRQUNoRixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEtBQUssQ0FBQyxFQUFFO2dCQUN4SCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7YUFDdEQ7WUFDRCxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztTQUMzQzthQUFNO1lBQ0gsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7U0FDekM7SUFDTCxDQUFDO0lBR08sOEJBQThCO1FBQ2xDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxnQ0FBZ0M7UUFDcEMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO0lBQzlGLENBQUM7SUFFRDs7T0FFRztJQUNJLG9CQUFvQjtRQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QjtZQUN2RixDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxJQUEyQixFQUFFLDJCQUFxQztRQUN0RixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDM0UsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQUMsS0FBWSxFQUFFLElBQTJCLEVBQUUsMkJBQXFDO1FBQ25HLElBQUksS0FBSyxFQUFFO1lBQ1AsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUMzQjtRQUVELElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLDJCQUEyQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDbkgsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUMvQzthQUFNO1lBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDN0Msb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFOUIsaUdBQWlHO1FBQ2pHLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsK0JBQStCLEdBQUcsS0FBSyxDQUFDO1lBRTdDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxDQUFDO1lBRWhELElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDdkIsT0FBTzthQUNWO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDM0QsT0FBTzthQUNWO1lBRUQsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDakIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM5QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3hDO1NBQ0o7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0I7UUFDbkIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM5QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3pDO1NBQ0o7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksaUJBQWlCLENBQUMsTUFBZ0M7UUFDckQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3ZDLElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUNqRixlQUFlLEdBQUcsYUFBYSxDQUFDO2FBQ25DO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sS0FBSyxlQUFlLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZ0JBQWdCLENBQUMsTUFBZ0MsRUFBRSxZQUFtQztRQUN6RixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztZQUMvQixDQUFDLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDcEYsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztJQUMzRCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsS0FBSztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQzFELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNwRSxDQUFDO0lBRU0sZUFBZSxDQUFDLFdBQW1CLEVBQUUsS0FBSztRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVyRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNoSCxNQUFNLGVBQWUsR0FBYSxFQUFFLENBQUM7UUFDckMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEQsZUFBZSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxVQUFVLElBQUksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1NBQ3JEO1FBRUQsNERBQTREO1FBQzVELG9GQUFvRjtRQUNwRixtREFBbUQ7UUFDbkQsTUFBTSwwQkFBMEIsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRSxJQUFJLHdCQUF3QixHQUFHLDBCQUEwQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWhGLG1HQUFtRztRQUNuRyx1REFBdUQ7UUFDdkQsZ0VBQWdFO1FBQ2hFLE1BQU0sZUFBZSxHQUFHLFdBQVcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0csTUFBTSx1QkFBdUIsR0FBRyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RSxJQUFJLHFCQUFxQixHQUFHLHVCQUF1QixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTFFLDRIQUE0SDtRQUM1SCxxQ0FBcUM7UUFDckMsc0dBQXNHO1FBQ3RHLHdHQUF3RztRQUN4RyxJQUFJLHdCQUF3QixHQUFHLGtCQUFrQixDQUFDLGNBQWMsRUFBRTtZQUM5RCxJQUFJLDZCQUE2QixHQUFHLENBQUMsQ0FBQztZQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLGVBQWUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEUsNkJBQTZCLElBQUksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO2FBQ3hFO1lBRUQsTUFBTSwrQkFBK0IsR0FBRyxVQUFVLEdBQUcsNkJBQTZCLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxDQUFDO1lBQ3pILE1BQU0sZ0NBQWdDLEdBQUcsVUFBVSxHQUFHLDZCQUE2QixHQUFHLHFCQUFxQixDQUFDO1lBRTVHLElBQUksNkJBQTZCLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25DLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQzNCLGdDQUFnQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLCtCQUErQixDQUFDLEVBQzFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN2QyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDO2dCQUNwQyw2QkFBNkIsSUFBSSxjQUFjLENBQUM7YUFDbkQ7WUFDRCx3QkFBd0IsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEQscUJBQXFCLEdBQUcsVUFBVSxHQUFHLDZCQUE2QixHQUFHLDZCQUE2QixDQUFDO1NBQ3RHO1FBRUQsMEhBQTBIO1FBQzFILHdDQUF3QztRQUN4Qyx5R0FBeUc7UUFDekcsNEdBQTRHO1FBQzVHLElBQUkscUJBQXFCLEdBQUcsa0JBQWtCLENBQUMsY0FBYyxFQUFFO1lBQzNELElBQUksNEJBQTRCLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2Qyw0QkFBNEIsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7YUFDdkU7WUFFRCxNQUFNLGdDQUFnQyxHQUFHLFVBQVUsR0FBRyw0QkFBNEIsR0FBRywwQkFBMEIsQ0FBQyxXQUFXLENBQUM7WUFDNUgsTUFBTSxpQ0FBaUMsR0FBRyxVQUFVLEdBQUcsNEJBQTRCLEdBQUcsd0JBQXdCLENBQUM7WUFFL0csSUFBSSw4QkFBOEIsR0FBRyxDQUFDLENBQUM7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDaEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDM0IsaUNBQWlDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsZ0NBQWdDLENBQUMsRUFDNUcsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3ZDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUM7Z0JBQ3BDLDhCQUE4QixJQUFJLGNBQWMsQ0FBQzthQUNwRDtZQUNELHdCQUF3QixHQUFHLFVBQVUsR0FBRyw0QkFBNEIsR0FBRyw4QkFBOEIsQ0FBQztZQUN0RyxxQkFBcUIsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDNUQ7UUFFRCxlQUFlLENBQUMsV0FBVyxDQUFDLEdBQUcsd0JBQXdCLENBQUM7UUFDeEQsZUFBZSxDQUFDLGVBQWUsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO1FBRXpELDhEQUE4RDtRQUM5RCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoQyxNQUFNLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDN0MsS0FBSyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztRQUVILGdFQUFnRTtRQUNoRSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNoQyxNQUFNLENBQUMsZUFBZSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztnQkFDekgsS0FBSyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLE1BQWdDO1FBQy9DLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRTtnQkFDaEQsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO29CQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssaUJBQWlCLENBQUMsSUFBSSxFQUFFO3dCQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztxQkFDNUM7eUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGlCQUFpQixDQUFDLE1BQU0sRUFBRTt3QkFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7cUJBQzdDO3lCQUFNO3dCQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO3FCQUM1QztvQkFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxJQUFJLENBQUMsbUNBQW1DLEVBQUU7d0JBQzFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDekM7b0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFFMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO29CQUNuRyxJQUFJLE9BQU8sRUFBRTt3QkFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQzdELFVBQVUsQ0FDTixHQUFHLEVBQUU7NEJBQ0QsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNwQixDQUFDLEVBQ0QsR0FBRyxDQUFDLENBQUM7d0JBQ1Qsb0NBQW9DO3dCQUNwQyw2REFBNkQ7d0JBQzdELDJHQUEyRztxQkFDOUc7aUJBQ0o7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7aUJBQzFDO2FBQ0o7WUFFRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxLQUFpQixFQUFFLElBQTJCO1FBQ2hFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7T0FFRztJQUNJLDBCQUEwQixDQUFDLGlCQUEyQjtRQUN6RCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7Z0JBQzdELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDakIsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2lCQUN2QztxQkFBTTtvQkFDSCxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztpQkFDbEM7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUNqQixhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7cUJBQzFDO3lCQUFNO3dCQUNILGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyQztpQkFDSjthQUNKO1NBQ0o7UUFDRCxJQUFJLGFBQWEsRUFBRTtZQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDaEQsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRTtvQkFDOUMsS0FBSyxHQUFHLElBQUksQ0FBQztpQkFDaEI7Z0JBRUQsSUFBSSxLQUFLLEVBQUU7b0JBQ1AsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFFM0MsSUFBSSxpQkFBaUIsRUFBRTt3QkFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRTs0QkFDWixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUM7NEJBQ3pFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQzs0QkFDL0QsTUFBTSxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsdUNBQXVDLENBQUMsQ0FBQzs0QkFDckcsSUFBSSxtQkFBbUIsRUFBRTtnQ0FDckIsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHO3NDQUNqRSxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUcsQ0FBQztnQ0FDcEQsc0JBQXNCLENBQUMsU0FBUyxHQUFHLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTO3NDQUMxRSxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDOzZCQUNqRDt3QkFDTCxDQUFDLENBQUMsQ0FBQztxQkFDTjtvQkFFRCxNQUFNO2lCQUNUO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxxQkFBcUIsQ0FBQyxJQUEyQixFQUFFLGNBQXdCO1FBQzlFLHFIQUFxSDtRQUNySCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsV0FBVyxFQUFFO1lBQ3JELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyx5QkFBeUIsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7Z0JBQ3hHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUMvQztxQkFBTTtvQkFDSCxJQUFJLENBQUMsY0FBYyxFQUFFO3dCQUNqQixJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkM7aUJBQ0o7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDdkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUMxQzthQUNKO2lCQUFNO2dCQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQzlDO3FCQUFNO29CQUNILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLGNBQWMsRUFBRTt3QkFDakIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3ZDO2lCQUNKO2FBQ0o7U0FDSjthQUFNO1lBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUN2RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9FLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLFFBQVEsRUFBRTtvQkFDVixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDcEQ7aUJBQ0o7cUJBQU07b0JBQ0gsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ2QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDbEQ7aUJBQ0o7YUFDSjtZQUVELElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQzlCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZDO1NBQ0o7UUFFRCx1R0FBdUc7UUFDdkcsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksd0JBQXdCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDN0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QyxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzthQUN2QjtTQUNKO2FBQU07WUFDSCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNyRDtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxJQUEyQjtRQUM3QyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDLFdBQVcsRUFBRTtnQkFDckQsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDNUU7aUJBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLDJCQUEyQixDQUFDLFFBQVEsRUFBRTtnQkFDcEUsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDaEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUUsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQzsyQkFDekUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUM7Z0JBQzVELENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLFFBQVEsR0FBRyxLQUFLLENBQUM7aUJBQ3BCO3FCQUFNO29CQUNILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUN4QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7NEJBQ3RELFFBQVEsR0FBRyxLQUFLLENBQUM7NEJBQ2pCLE1BQU07eUJBQ1Q7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssMkJBQTJCLENBQUMsUUFBUSxFQUFFO2dCQUM3RCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUM5QztpQkFBTTtnQkFDSCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDakg7U0FDSjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxLQUFhO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsSUFBVyxZQUFZLENBQUMsS0FBYTtRQUNqQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUN4QjtZQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxpQkFBaUIsQ0FBQyxHQUFRLEVBQUUsSUFBWTtRQUMzQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDYixNQUFNLFlBQVksR0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzNCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1lBRUQsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtvQkFDakQsTUFBTTtpQkFDVDthQUNKO1lBQ0QsT0FBTyxVQUFVLENBQUM7U0FDckI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSwwQkFBMEI7UUFDN0IsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDeEMsQ0FBQztJQUVPLDBCQUEwQixDQUFDLEtBQWE7UUFDNUMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSx5QkFBeUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3pHLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxLQUFhLEVBQUUsY0FBdUIsSUFBSTtRQUN0RSxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksYUFBYSxDQUFDLFFBQWdCO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGdCQUFnQjtRQUN6RCxtQ0FBbUM7UUFDbkMscUlBQXFJLFFBQVEseUNBQXlDLENBQUMsQ0FBQztRQUU1TCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSSx5QkFBeUIsQ0FBQyxjQUF1QixJQUFJO1FBQ3hELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUNBQWlDLENBQUMsY0FBdUIsSUFBSTtRQUNoRSxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqRyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ1osUUFBUSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1NBQ3BFO1FBRUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSwwQkFBMEIsQ0FBQyxjQUF1QixJQUFJO1FBQ3pELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBRWpHLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDWixRQUFRLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7T0FHRztJQUVJLHNCQUFzQixDQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUUsV0FBb0I7UUFDbEUsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFFL0YsSUFBSSxXQUFXLEVBQUU7WUFDYixLQUFLLEdBQUcsV0FBVyxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNaLFFBQVEsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSw2QkFBNkIsQ0FBQyxjQUF1QixJQUFJO1FBQzVELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pHLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixRQUFRLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSx3QkFBd0IsQ0FBQyxjQUF1QixJQUFJO1FBQ3ZELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVEOzs7T0FHRztJQUNJLCtCQUErQixDQUFDLFNBQStDLEVBQUUsV0FBb0I7UUFDeEcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDM0UsTUFBTTthQUNUO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssMkJBQTJCLENBQUMsS0FBYSxFQUFFLFdBQW9CLEVBQUUsVUFBbUIsSUFBSTtRQUM1RixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDWCxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ2I7UUFFRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUN6QztRQUVELElBQUksV0FBVyxFQUFFO1lBQ2IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFDO2FBQU07WUFDSCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUM7ZUFDaEQsSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRO2VBQzNELElBQUksQ0FBQyxvQ0FBb0MsSUFBSSxXQUFXLEVBQUU7WUFDN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDO1FBQ3pFLE1BQU0sb0JBQW9CLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDLFlBQVksQ0FBQztRQUN2RyxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztRQUVoRyxNQUFNLDZCQUE2QixHQUFHLHlCQUF5QixHQUFHLHNCQUFzQixDQUFDLFNBQVMsR0FBRyxvQkFBb0I7Y0FDbkgsSUFBSSxDQUFDLDRCQUE0QixDQUFDO1FBRXhDLElBQUksdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDNUYsdUJBQXVCLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLENBQUM7U0FDM0U7UUFFRCxJQUFJLEtBQUssSUFBSSw2QkFBNkIsRUFBRTtZQUN4Qyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7U0FDbkM7UUFFRCxvSEFBb0g7UUFDcEgsSUFBSSx1QkFBdUIsR0FBRyxDQUFDLEVBQUU7WUFDN0IsMkVBQTJFO1lBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyx1QkFBdUIsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7WUFFM0csSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixzSEFBc0g7Z0JBQ3RILHNEQUFzRDtnQkFDdEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxvQkFBb0IsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUVyRyxtR0FBbUc7Z0JBQ25HLGdHQUFnRztnQkFDaEcsb0dBQW9HO2dCQUNwRyw4RkFBOEY7Z0JBQzlGLElBQUksQ0FBQyw0QkFBNEIsR0FBRyx1QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQztnQkFDbEYsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QjtzQkFDN0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNqQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsQ0FBQyxDQUFDO2lCQUN6QzthQUNKO2lCQUFNO2dCQUNILElBQUksQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLENBQUM7YUFDekM7WUFFRCxvREFBb0Q7WUFDcEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ2hFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDN0M7YUFBTSxJQUFJLE9BQU8sRUFBRTtZQUNoQixJQUFJLFdBQVcsRUFBRTtnQkFDYixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzthQUNoQztpQkFBTTtnQkFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEM7U0FDSjtJQUNMLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxLQUFhO1FBQ3RDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sNkJBQTZCLENBQUMsWUFBbUM7UUFDcEUsSUFBSSxNQUFjLENBQUM7UUFFbkIsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDLFdBQVcsRUFBRTtZQUM3RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRSxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUU7Z0JBQy9CLE1BQU0sR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDdkM7U0FDSjthQUFNLElBQUksWUFBWSxDQUFDLElBQUksS0FBSyx5QkFBeUIsQ0FBQyxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5RixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUM3RTtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxrQ0FBa0MsQ0FBQyxZQUFtQztRQUN6RSxJQUFJLE1BQWMsQ0FBQztRQUNuQixRQUFRLFlBQVksQ0FBQyxJQUFJLEVBQUU7WUFDdkIsS0FBSyx5QkFBeUIsQ0FBQyxRQUFRO2dCQUNuQyxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hGLE1BQU0sR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO29CQUNyRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdEcsTUFBTTtZQUNWLEtBQUsseUJBQXlCLENBQUMsV0FBVztnQkFDdEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNoRSxNQUFNLEdBQUcsY0FBYyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7b0JBQ2pHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbEcsTUFBTTtTQUNiO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFlBQW1DLEVBQUUsS0FBYTtRQUMzRSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxnQkFBZ0IsR0FBcUIsWUFBWSxDQUFDLElBQUksQ0FBQztZQUU3RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUM5RyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuRyxJQUFJLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUN6QixJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDdkU7Z0JBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixLQUFLLE1BQU0sUUFBUSxJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFO29CQUN0RCxJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDNUQsSUFBSSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTs0QkFDN0MsS0FBSyxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs0QkFDMUQsTUFBTTt5QkFDVDtxQkFDSjtpQkFDSjtnQkFDRCxJQUFJLEtBQUssRUFBRTtvQkFDUCxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDMUU7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQzthQUMxRDtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLDBCQUEwQjtRQUM3QixJQUFJLENBQUMscUJBQXFCLEdBQUc7WUFDekIsVUFBVSxFQUFFLEVBQUU7WUFDZCxZQUFZLEVBQUUsRUFBRTtZQUNoQixZQUFZLEVBQUUsRUFBRTtTQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sd0JBQXdCLENBQUMsWUFBbUMsRUFBRSxLQUFhLEVBQUUsS0FBVTtRQUMxRixNQUFNLGdCQUFnQixHQUFxQixZQUFZLENBQUMsSUFBSSxDQUFDO1FBQzdELGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVqRCxZQUFZLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDbkYsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztvQkFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUNwQixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDekQsQ0FBQyxDQUFDO2FBQ047UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCwwREFBMEQ7SUFDbkQsa0JBQWtCLENBQUMsWUFBbUM7UUFDekQsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLElBQUksWUFBWSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVNLCtCQUErQixDQUFDLFlBQW1DO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLDZCQUE2QixDQUFDLCtCQUErQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0csQ0FBQztJQUVNLHlCQUF5QixDQUFDLE1BQWdDO1FBQzdELE9BQU8sSUFBSSxDQUFDLDZCQUE2QixDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFTSxjQUFjLENBQUMsb0JBQThCO1FBQ2hELElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7WUFDN0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7U0FDdkI7YUFBTTtZQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUdNLDRDQUE0QyxDQUFDLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0YsSUFBSSxJQUFJLENBQUMsZ0NBQWdDO2FBQ3BDLDRDQUE0QyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUVyRyxJQUFJLFVBQVUsRUFBRTtnQkFDWixJQUFJLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pEO1lBRUQsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQzFCO1lBRUQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksVUFBVSxFQUFFO1lBQ1osSUFBSSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxRDtRQUVELElBQUksV0FBVyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzFCO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVNLHNCQUFzQjtRQUN6QixJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sY0FBYyxDQUFDLFlBQXNCLEVBQ3hDLG1CQUF1RCxFQUN2RCxxQkFBZ0QsRUFDaEQsb0JBQTBELEVBQzFELE9BQU8sR0FBRyxJQUFJLEVBQ2QsK0JBQXlDLEVBQUUsY0FBd0I7UUFDbkUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRTtZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUc7WUFDdEIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsU0FBUyxFQUFFLElBQUk7WUFDZix1QkFBdUIsRUFBRSxDQUFDO1lBQzFCLHdCQUF3QixFQUFFLENBQUM7WUFDM0IsY0FBYyxFQUFFLHFCQUFxQjtZQUNyQywyQkFBMkIsRUFBRSxJQUFJLElBQUksRUFBRTtTQUMxQyxDQUFDO1FBRUYsSUFBSSxDQUFDLG9CQUFvQixDQUNyQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCwrQkFBK0IsRUFDL0IsSUFBSSxFQUNKLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFTSwyQkFBMkI7UUFDOUIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtZQUNoSCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztJQUNoRixDQUFDO0lBRVMscUJBQXFCO1FBQzNCLE9BQU8sS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3hDLGdCQUFnQjtTQUNuQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsbUJBQXVELEVBQ2hGLG9CQUEwRCxFQUMxRCxPQUFnQixFQUFFLCtCQUF5QyxFQUMzRCxhQUFxQyxFQUFFLGNBQXdCO1FBQy9ELFVBQVUsQ0FDTixHQUFHLEVBQUU7WUFDRCxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksYUFBYSxHQUEwQixJQUFJLENBQUM7WUFDaEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQy9GLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDL0YsY0FBYyxHQUFHLElBQUksQ0FBQztvQkFFdEIsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUNsRixJQUFJLEtBQUs7d0JBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO3dCQUMzRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUTsrQkFDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDdEcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzt5QkFDNUQ7d0JBQ0QsU0FBUyxHQUFHLElBQUksQ0FBQzt3QkFFakIsSUFBSSxDQUFDLCtCQUErQixFQUFFOzRCQUNsQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3lCQUM5Qzt3QkFDRCxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFFdEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUNyRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs0QkFDMUMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dDQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ2hEOzRCQUNELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDdEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFO2dDQUN4QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUNoRDs0QkFDRCxjQUFjLEdBQUcsS0FBSyxDQUFDOzRCQUN2QixNQUFNO3lCQUNUO3dCQUVELElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzVFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDOzRCQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDekQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLDJCQUEyQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7eUJBQ3BFO3dCQUVELE1BQU07cUJBQ1Q7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLGFBQWE7K0JBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQUM7K0JBQ3JGLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFDakYsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3pDO3FCQUNKO29CQUVELElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixHQUFHLENBQUM7MkJBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztnQ0FDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO3dCQUNwRixNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7WUFFRCxJQUFJLGNBQWMsRUFBRTtnQkFDaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRTtvQkFDdkcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQzFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsRUFBRTt3QkFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDOUMsSUFBSSxhQUFhLEVBQUU7NEJBQ2YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7NEJBQ3JDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDekM7NkJBQU0sSUFBSSxhQUFhLEVBQUU7NEJBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDOzRCQUNyQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3pDO3FCQUNKO2lCQUNKO3FCQUFNO29CQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FDckIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixPQUFPLEVBQ1AsK0JBQStCLEVBQy9CLGFBQWEsRUFDYixjQUFjLENBQUMsQ0FBQztpQkFDdkI7YUFDSjtRQUNMLENBQUMsRUFDRCxHQUFHLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFTyxZQUFZO1FBQ2hCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3pELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDakM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxTQUFTO1FBQ2IsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDdkMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ25CLElBQUksMEJBQTBCLEdBQUcsSUFBSSxDQUFDO2dCQUN0QyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7b0JBQzVDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQy9DLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQzVCLDBCQUEwQixHQUFHLFlBQVksQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUMvRDtpQkFDSjtnQkFFRCxJQUFJLDJCQUEyQixHQUFHLEtBQUssQ0FBQztnQkFFeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFDZixJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQzt3QkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dDQUN2RCxvQkFBb0IsR0FBRyxLQUFLLENBQUM7Z0NBQzdCLE1BQU07NkJBQ1Q7eUJBQ0o7d0JBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRTs0QkFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUNsRCxPQUFPO3lCQUNWOzZCQUFNOzRCQUNILElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQ0FDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29DQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQ0FDakc7NkJBQ0o7aUNBQU07Z0NBQ0gsMkJBQTJCLEdBQUcsSUFBSSxDQUFDOzZCQUN0Qzt5QkFDSjtxQkFDSjtpQkFDSjtnQkFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDbkIsU0FBUyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxFQUFFO3dCQUNoRiwyQkFBMkIsR0FBRyxJQUFJLENBQUM7b0JBQ3ZDLENBQUM7aUJBQ0osQ0FBQyxDQUFDO2dCQUVILElBQUksMkJBQTJCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFOzRCQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dDQUNsRCxPQUFPLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2xGLENBQUMsQ0FBQyxDQUFDO3lCQUNOOzZCQUFNOzRCQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQ2xELE9BQU8sYUFBYSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNsRyxDQUFDLENBQUMsQ0FBQzt5QkFDTjtxQkFDSjt5QkFBTTt3QkFDSCx5RUFBeUU7d0JBQ3pFLHNEQUFzRDt3QkFDdEQsOEVBQThFO3dCQUM5RSwrRUFBK0U7d0JBQy9FLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQzt3QkFDeEIsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDckIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQzVDLElBQUksV0FBVyxDQUFDLElBQUksRUFBRTtnQ0FDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUM3Qzs0QkFDRCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNsQyxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDOzRCQUNwQyxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQ0FDOUIsMERBQTBEO2dDQUMxRCx3RUFBd0U7Z0NBQ3hFLHNFQUFzRTtnQ0FDdEUsNEJBQTRCO2dDQUM1QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQ0FDM0MsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO3dDQUMzQyxPQUFPLENBQUMsQ0FBQztxQ0FDWjt5Q0FBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7d0NBQ2xELE9BQU8sQ0FBQyxDQUFDLENBQUM7cUNBQ2I7aUNBQ0o7cUNBQU07b0NBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7b0NBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29DQUUxRSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTt3Q0FDOUMsT0FBTyxDQUFDLENBQUM7cUNBQ1o7eUNBQU0sSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7d0NBQ3JELE9BQU8sQ0FBQyxDQUFDLENBQUM7cUNBQ2I7aUNBQ0o7Z0NBQ0QsT0FBTyxDQUFDLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDN0YsQ0FBQyxDQUFDLENBQUM7NEJBQ0gsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQ0FDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDckIsQ0FBQyxDQUFDLENBQUM7eUJBQ047cUJBQ0o7aUJBQ0o7Z0JBRUQsSUFBSSwwQkFBMEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7b0JBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7aUJBQU07Z0JBQ0gsbUVBQW1FO2dCQUNuRSxpREFBaUQ7Z0JBQ2pELE1BQU0sbUJBQW1CLEdBQTRCLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxvQkFBNkMsQ0FBQztnQkFDbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNoRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDLFdBQVcsRUFBRTt3QkFDdEUsSUFBSSxvQkFBb0IsRUFBRTs0QkFDdEIsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dDQUN0RCxPQUFPLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2xGLENBQUMsQ0FBQyxDQUFDOzRCQUNILG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQ0FDaEMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNuQyxDQUFDLENBQUMsQ0FBQzt5QkFDTjt3QkFDRCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNoRCxvQkFBb0IsR0FBRyxFQUFFLENBQUM7cUJBQzdCO3lCQUFNO3dCQUNILG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3BEO2lCQUNKO2dCQUNELElBQUksb0JBQW9CLEVBQUU7b0JBQ3RCLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDdEQsT0FBTyxhQUFhLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNsRixDQUFDLENBQUMsQ0FBQztvQkFDSCxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2hDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLENBQUM7aUJBQ047Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQzthQUM1QztZQUNELElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxDQUFDO1NBQ25EO0lBQ0wsQ0FBQztJQUVPLDBCQUEwQixDQUFDLENBQW9CLEVBQUUsQ0FBb0IsRUFBRSxLQUFhO1FBQ3hGLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDVixNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7YUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQixNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNoQixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDZjthQUFNO1lBQ0gsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRTlDLE1BQU0sUUFBUSxHQUFHLE9BQU8sTUFBTSxDQUFDO1lBQy9CLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTtnQkFDdkIsTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRTlELElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRTtvQkFDakIsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDZDtxQkFBTSxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUU7b0JBQ3hCLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDZjthQUNKO2lCQUFNO2dCQUNILE1BQU0sR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUM1RSxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFFNUUsdUNBQXVDO2dCQUN2Qyw0RkFBNEY7Z0JBQzVGLHVFQUF1RTtnQkFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtvQkFDMUIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQztvQkFFOUQsbURBQW1EO29CQUNuRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQ2QsT0FBTyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRTt3QkFDbkQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUNqQyxNQUFNO3lCQUNUO3dCQUNELEtBQUssRUFBRSxDQUFDO3FCQUNYO29CQUVELGdHQUFnRztvQkFDaEcsbUhBQW1IO29CQUNuSCxtREFBbUQ7b0JBQ25ELHVIQUF1SDtvQkFDdkgsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUNwRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7d0JBQ25FLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDbkUsSUFBSSxPQUFPLEdBQUcsT0FBTyxFQUFFOzRCQUNuQixNQUFNLEdBQUcsQ0FBQyxDQUFDO3lCQUNkOzZCQUFNLElBQUksT0FBTyxHQUFHLE9BQU8sRUFBRTs0QkFDMUIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3lCQUNmO3FCQUNKO3lCQUFNO3dCQUNILElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRTs0QkFDakIsTUFBTSxHQUFHLENBQUMsQ0FBQzt5QkFDZDs2QkFBTSxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUU7NEJBQ3hCLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzt5QkFDZjtxQkFDSjtpQkFDSjtxQkFBTTtvQkFDSCxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUU7d0JBQ2pCLE1BQU0sR0FBRyxDQUFDLENBQUM7cUJBQ2Q7eUJBQU0sSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFO3dCQUN4QixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ2Y7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLG1CQUFtQjtRQUN2QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO0lBQ3RILENBQUM7SUFFTyxjQUFjO1FBQ2xCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNoQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUNsQztRQUNELElBQUksbUJBQW1CLEtBQUssSUFBSSxDQUFDLDBCQUEwQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUNwRixJQUFJLG1CQUFtQixFQUFFO2dCQUNyQixJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7Z0JBQzNHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO2FBQzNGO2lCQUFNO2dCQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7Z0JBQzNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7YUFDNUQ7U0FDSjtRQUNELElBQUksQ0FBQywwQkFBMEIsR0FBRyxtQkFBbUIsQ0FBQztJQUMxRCxDQUFDO0lBRU8sdUJBQXVCO1FBQzNCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsU0FBUyxDQUFDLFNBQVMsR0FBRyxzRUFBc0UsQ0FBQztRQUM3RixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7UUFDaEMsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxjQUFjLENBQUM7SUFDbkQsQ0FBQztJQUVPLHVCQUF1QixDQUFDLGdCQUEwQixFQUFFLFdBQXFCO1FBQzdFLElBQUksSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsdUdBQXVHO1lBQ3ZHLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQztZQUV6RSw4REFBOEQ7WUFDOUQsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxVQUFVO2dCQUMvQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDM0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBRWhDLElBQUksc0JBQXNCLENBQUMsWUFBWSxFQUFFO2dCQUNyQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLENBQUM7Z0JBQy9GLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ2hHO1lBRUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztZQUUzQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUVoRCxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO2dCQUMvQixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksZ0JBQWdCLEVBQUU7b0JBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxDQUFDOzBCQUMxRixJQUFJLENBQUMsaUNBQWlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztvQkFDL0csVUFBVSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztvQkFDcEQsSUFBSSxDQUFDLDRCQUE0QixHQUFHLENBQUMsQ0FBQztvQkFDdEMsc0JBQXNCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7aUJBQ3pEO3FCQUFNO29CQUNILG1FQUFtRTtvQkFDbkUsK0VBQStFO29CQUMvRSw2R0FBNkc7b0JBQzdHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssc0JBQXNCLENBQUMsU0FBUyxFQUFFO3dCQUNyRSxJQUFJLENBQUMsYUFBYSxHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQztxQkFDekQ7b0JBRUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhOzBCQUN6RyxDQUFDLHNCQUFzQixDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDbEYsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7b0JBQ2hGLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTt3QkFDNUUsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQzt3QkFDM0UsY0FBYyxHQUFHLElBQUksQ0FBQztxQkFDekI7b0JBQ0QsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLFVBQVUsQ0FBQztpQkFDdkQ7Z0JBRUQsNkZBQTZGO2dCQUM3RixJQUFJLHNCQUFzQixDQUFDLFlBQVksSUFBSSxzQkFBc0IsQ0FBQyxZQUFZLEVBQUU7b0JBQzVFLFVBQVUsR0FBRyxDQUFDLENBQUM7aUJBQ2xCO2dCQUVELGlCQUFpQixHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDeEYsMEVBQTBFO2dCQUMxRSxzSEFBc0g7Z0JBQ3RILGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyw0QkFBNEI7c0JBQ3hHLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzthQUNsRTtZQUVELElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztZQUUzQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2Ysa0dBQWtHO2dCQUNsRyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDakUsSUFBSSxtQkFBbUIsR0FBRyxhQUFhLENBQUM7Z0JBQ3hDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDO2dCQUM1RixJQUFJLG9CQUFvQixHQUFHLGNBQWMsQ0FBQztnQkFFMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxHQUFHLGFBQWEsR0FBRyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2pFLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxDQUFDLGNBQWMsSUFBSSxjQUFjLEVBQUU7d0JBQ25DLGNBQWMsR0FBRyxJQUFJLENBQUM7d0JBQ3RCLG1CQUFtQixHQUFHLENBQUMsQ0FBQztxQkFDM0I7b0JBQ0QsSUFBSSxjQUFjLElBQUksQ0FBQyxjQUFjLEVBQUU7d0JBQ25DLE1BQU07cUJBQ1Q7b0JBQ0Qsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztpQkFDdEQ7Z0JBRUQsSUFBSSxvQkFBb0IsS0FBSyxDQUFDLEVBQUU7b0JBQzVCLGNBQWMsR0FBRyxLQUFLLENBQUM7aUJBQzFCO2dCQUVELElBQUksY0FBYyxFQUFFO29CQUNoQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7b0JBQ2xCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTt3QkFDakIsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTs0QkFDOUIsS0FBSyxpQkFBaUIsQ0FBQyxNQUFNO2dDQUN6QixTQUFTLEdBQUcsQ0FBQyxDQUFDO2dDQUNkLE1BQU07NEJBQ1YsS0FBSyxpQkFBaUIsQ0FBQyxPQUFPO2dDQUMxQixTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0NBQ2YsTUFBTTs0QkFDVjtnQ0FDSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dDQUNkLE1BQU07eUJBQ2I7cUJBQ0o7b0JBRUQsTUFBTSxhQUFhLEdBQUc7d0JBQ2xCLEtBQUssRUFBRSxtQkFBbUI7d0JBQzFCLE1BQU0sRUFBRSxvQkFBb0I7d0JBQzVCLGlCQUFpQixFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFOzRCQUNuQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO2dDQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsR0FBRzt3Q0FDMUMsS0FBSyxFQUFFLG1CQUFtQixHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSx5QkFBeUIsQ0FBQyxNQUFNO3FDQUN6RixDQUFDO2lDQUNMO2dDQUNELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dDQUUvQiw4RUFBOEU7Z0NBQzlFLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO2dDQUM5QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0NBRXJCLHdHQUF3RztnQ0FDeEcsZ0RBQWdEO2dDQUNoRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7NkJBQ3RCO3dCQUNMLENBQUM7d0JBQ0QsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7cUJBQy9HLENBQUM7b0JBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBRXpDLElBQUksb0JBQW9CLElBQUksSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7d0JBQ2hGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO3FCQUN0QjtpQkFDSjthQUNKO1lBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDakIsd0ZBQXdGO2dCQUN4Rix3REFBd0Q7Z0JBQ3hELDRGQUE0RjtnQkFDNUYsOERBQThEO2dCQUM5RCxJQUFJLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFFL0QsaUdBQWlHO2dCQUNqRyxrR0FBa0c7Z0JBQ2xHLDJHQUEyRztnQkFDM0csa0ZBQWtGO2dCQUNsRixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLHNCQUFzQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNsRixNQUFNLEdBQUcsQ0FBQyxDQUFDO2lCQUNkO2dCQUVELElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztvQkFFakUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztvQkFDNUQsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixHQUFHLENBQUM7MkJBQ25FLGlCQUFpQixHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7d0JBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsc0JBQXNCLENBQUMsU0FBUzs4QkFDakQsQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7cUJBQ25HO29CQUVELDRHQUE0RztvQkFDNUcsb0dBQW9HO29CQUNwRyw0R0FBNEc7b0JBQzVHLGdEQUFnRDtvQkFDaEQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVM7MkJBQzdFLHNCQUFzQixDQUFDLFNBQVM7NEJBQ25DLHNCQUFzQixDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDOzJCQUMzRixjQUFjLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsc0JBQXNCLENBQUMsWUFBWTs4QkFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO3FCQUN2RTtvQkFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7b0JBQ3RELElBQUksV0FBVyxFQUFFO3dCQUNiLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLENBQUM7cUJBQ3pDO29CQUNELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7aUJBQ2pGO2dCQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO3VCQUNwRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQzt1QkFDbEYsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ25DLDRGQUE0RjtvQkFDNUYsZ0dBQWdHO29CQUNoRyw0R0FBNEc7b0JBQzVHLHdHQUF3RztvQkFDeEcsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztvQkFDckMsSUFBSSxDQUFDLCtCQUErQixHQUFHLEVBQUUsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVTsyQkFDNUIsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsWUFBWTsrQkFDdEUsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ2hELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTt3QkFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUNqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUM1QixJQUFJLEtBQUssR0FBRyxVQUFVLEVBQUU7Z0NBQ3BCLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7b0NBQ2pELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDdEQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQzt3Q0FDakMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLElBQUk7d0NBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO3dDQUNoRixLQUFLLEVBQUUsbUJBQW1CLENBQUMsS0FBSzt3Q0FDaEMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLFdBQVc7d0NBQzVDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO3dDQUM5QixLQUFLLEVBQUUsS0FBSzt3Q0FDWixhQUFhLEVBQUUsbUJBQW1CLENBQUMsYUFBYTt3Q0FDaEQsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE9BQU87d0NBQ3BDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLGdCQUFnQjtxQ0FDekQsQ0FBQyxDQUFDO2lDQUNOO3FDQUFNO29DQUNILElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQ0FDbEc7NkJBQ0o7eUJBQ0o7cUJBQ0o7b0JBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxHQUFHLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTs0QkFDakQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUN0RCxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDO2dDQUN0QyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtnQ0FDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUk7Z0NBQ2hGLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxLQUFLO2dDQUNoQyxXQUFXLEVBQUUsbUJBQW1CLENBQUMsV0FBVztnQ0FDNUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLElBQUk7Z0NBQzlCLEtBQUssRUFBRSxLQUFLO2dDQUNaLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxhQUFhO2dDQUNoRCxPQUFPLEVBQUUsbUJBQW1CLENBQUMsT0FBTztnQ0FDcEMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsZ0JBQWdCOzZCQUN6RCxDQUFDLENBQUM7eUJBQ047NkJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRTs0QkFDekYsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3lCQUN2RztxQkFDSjtpQkFDSjtnQkFDRCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ3ZCO1lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztpQkFDbkM7YUFDSjtZQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUMxQixJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsYUFBYTtvQkFDbEMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGNBQWMsQ0FBYyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7b0JBQ3hGLGtGQUFrRjtvQkFDbEYsb0RBQW9EO29CQUNwRCxPQUFPO2lCQUNWO2dCQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDOUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2lCQUMzRDtxQkFBTTtvQkFDSCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztpQkFDaEM7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVPLGFBQWE7UUFDakIsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDMUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLHdCQUF3QixJQUFJLHdCQUF3QixDQUFDLFFBQVE7WUFDdEYsd0JBQXdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ25CLElBQUksSUFBSSxDQUFDLFlBQVksWUFBWSx3QkFBd0IsRUFBRTtvQkFDdkQsTUFBTSxlQUFlLEdBQTZCLElBQUksQ0FBQyxZQUFZLENBQUM7b0JBQ3BFLElBQUksQ0FBQyxhQUFhLEdBQUcsZUFBZSxDQUFDLEtBQUssSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ2xHO3FCQUFNO29CQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7aUJBQ3ZIO2FBQ0o7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUM3QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0Q7aUJBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUMzQix3REFBd0Q7Z0JBQ3hELG9DQUFvQztnQkFDcEMsMERBQTBEO2dCQUMxRCxpREFBaUQ7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztvQkFDbEIsaUVBQWlFO29CQUNqRSw4QkFBOEI7b0JBQzlCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTt3QkFDakQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQ2hDLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtnQ0FDN0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUMzRixJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFO29DQUNuQyxJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRTt3Q0FDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7cUNBQ3hEO29DQUNELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7d0NBQzNCLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztxQ0FDaEQ7b0NBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTt3Q0FDckQsS0FBSyxHQUFHLElBQUksQ0FBQztxQ0FDaEI7aUNBQ0o7NkJBQ0o7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7cUJBQ047eUJBQU07d0JBQ0gsNEJBQTRCO3dCQUM1QiwrQ0FBK0M7d0JBQy9DLEtBQUssR0FBRyxJQUFJLENBQUM7cUJBQ2hCO29CQUNELDBEQUEwRDtvQkFDMUQscURBQXFEO29CQUNyRCxJQUFJLEtBQUssRUFBRTt3QkFDUCxJQUFJLG1CQUFtQixFQUFFOzRCQUNyQixvQ0FBb0M7NEJBQ3BDLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7eUJBQ3RFO3dCQUNELHNFQUFzRTt3QkFDdEUsSUFBSSxLQUFLLEVBQUU7NEJBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ2pDO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDbEY7WUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2FBQzVGO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQ3ZDLHNCQUFzQixFQUN0QixJQUFJLENBQUMsYUFBYSxLQUFLLFVBQVUsQ0FBQyxDQUFDO1NBQzFDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFzQixFQUFFLEtBQWEsRUFBRSxvQkFBeUIsRUFBRSxhQUFxQixFQUFFLE9BQWU7UUFDM0gsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkQ7U0FDSjtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUUzQixNQUFNLFlBQVksR0FBRztZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixJQUFJLEVBQUUseUJBQXlCLENBQUMsUUFBUTtZQUN4QyxLQUFLLEVBQUUsS0FBSztZQUNaLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTtZQUNoQyxhQUFhLEVBQUUsYUFBYTtZQUM1QixPQUFPLEVBQUUsT0FBTztTQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdEMsTUFBTSxxQkFBcUIsR0FBRztZQUMxQixJQUFJLEVBQUUsWUFBWTtZQUNsQixRQUFRLEVBQUUsRUFBRTtTQUNmLENBQUM7UUFFRiw2RUFBNkU7UUFDN0Usb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRTFELElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUM3QyxJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDMUIsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekcsb0JBQW9CLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQjtRQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsTUFBTSxNQUFNLEdBQW1FLEVBQUUsQ0FBQztZQUVsRixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssaUJBQWlCLENBQUMsSUFBSSxFQUFFO2dCQUMvQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxLQUFLLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUNsRCxPQUFPLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6RSxDQUFDLENBQUMsQ0FBQztpQkFDTjthQUNKO1lBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDOUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTt3QkFDNUIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO3dCQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUM7cUJBQzFDO29CQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRTt3QkFDakQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQztxQkFDdkU7b0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO2FBQ047WUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztvQkFDckIsSUFBSSxFQUFFLHlCQUF5QixDQUFDLFdBQVc7b0JBQzNDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU07b0JBQ2hDLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDcEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNO2lCQUN6QixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN6QyxJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztvQkFDN0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDOzRCQUNwQixJQUFJLEVBQUUsSUFBSTs0QkFDVixJQUFJLEVBQUUseUJBQXlCLENBQUMsU0FBUzs0QkFDekMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTs0QkFDaEMsYUFBYSxFQUFFLG9CQUFvQjs0QkFDbkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTTt5QkFDbEMsQ0FBQyxDQUFDO3dCQUNILG9CQUFvQixFQUFFLENBQUM7b0JBQzNCLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDL0MsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNaLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDdkYsb0JBQW9CLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLENBQUM7YUFDTjtTQUNKO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNoRCxNQUFNLFVBQVUsR0FBMEI7d0JBQ3RDLEtBQUssRUFBRSxLQUFLLEVBQUU7d0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO3dCQUMzQixJQUFJLEVBQUUseUJBQXlCLENBQUMsTUFBTTt3QkFDdEMsZ0JBQWdCLEVBQUUsRUFBRTtxQkFDdkIsQ0FBQztvQkFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDdkM7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3BCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUMvQyxPQUFPO3dCQUNILEtBQUssRUFBRSxLQUFLLEVBQUU7d0JBQ2QsSUFBSSxFQUFFLElBQUk7d0JBQ1YsSUFBSSxFQUFFLHlCQUF5QixDQUFDLE1BQU07cUJBQ3pDLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQUM7YUFDTjtpQkFBTTtnQkFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQzthQUMzQjtTQUNKO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBQyxnQkFBMEIsRUFBRSxXQUFxQjtRQUNqRSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU3QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFM0IscURBQXFEO1FBQ3JELElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNyRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBRXhELGdHQUFnRztZQUNoRyw0RkFBNEY7WUFDNUYsNkZBQTZGO1lBQzdGLDBEQUEwRDtZQUMxRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0NBQWdDLEVBQUU7Z0JBQ2hELHFIQUFxSDtnQkFDckgsd0VBQXdFO2dCQUN4RSxzRkFBc0Y7Z0JBQ3RGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDaEc7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNyRTtRQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzFDLE1BQU0sd0JBQXdCLEdBQTBCO2dCQUNwRCxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNO2dCQUNoQyxJQUFJLEVBQW9CO29CQUNwQixFQUFFLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRTtvQkFDckIsZ0JBQWdCLEVBQUUsRUFBRTtvQkFDcEIsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ25FLFFBQVEsRUFBRSxJQUFJO2lCQUNqQjtnQkFDRCxJQUFJLEVBQUUseUJBQXlCLENBQUMsTUFBTTtnQkFDdEMsZ0JBQWdCLEVBQUUsRUFBRTthQUN2QixDQUFDO1lBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sNEJBQTRCLENBQUMsK0JBQXdDO1FBQ3pFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQztRQUV6RSw0RUFBNEU7UUFDNUUsa0dBQWtHO1FBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLElBQUksc0JBQXNCLENBQUMsWUFBWSxFQUFFO1lBQzNFLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLENBQUM7U0FDM0U7UUFFRCxJQUFJLCtCQUErQixFQUFFO1lBQ2pDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLCtCQUErQixDQUFDO1NBQ3hGO1FBRUQsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUU7WUFDbkMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztZQUMvRixzQkFBc0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztTQUN2RDthQUFNO1lBQ0gsc0JBQXNCLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7U0FDdEQ7SUFDTCxDQUFDO0lBRU0sK0JBQStCO1FBQ2xDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyx5Q0FBeUMsQ0FDM0UsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRWpHLElBQUksSUFBSSxDQUFDLGdDQUFnQyxDQUFDLDRDQUE0QyxDQUNsRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7WUFDdkQsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0gsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUVJLE9BQU87UUFDVixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBRUsseUJBQXlCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDckYsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUdPLGVBQWU7UUFDbkIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFFbkYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7UUFDM0UsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsVUFBVSxHQUFHLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV2RixJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM1QixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUM7WUFDekUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUxQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDM0IsOEVBQThFO2dCQUM5RSxvQkFBb0I7Z0JBQ3BCLG1GQUFtRjtnQkFDbkYsd0JBQXdCO2dCQUN4QixtSEFBbUg7Z0JBQ25ILGlCQUFpQjtnQkFDakIscUNBQXFDO2dCQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFeEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQ3BDLE9BQU8sRUFDUCxHQUFHLGFBQWEsSUFBSSxDQUFDLENBQUM7Z0JBRTFCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFDaEMsT0FBTyxFQUNQLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQztnQkFFMUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7Z0JBRXZFLHVGQUF1RjtnQkFDdkYsSUFBSSxDQUFDLGFBQWE7cUJBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7cUJBQ3hFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDZCxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUUsZ0VBQWdFO29CQUNoRSxJQUFJLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFO3dCQUNuRCxNQUFNLENBQUMsZUFBZSxHQUFHLFFBQVEsR0FBRyxhQUFhLENBQUM7cUJBQ3JEO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2FBRVY7WUFFRCxvRkFBb0Y7WUFDcEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2hDLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRTtvQkFDeEIsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztpQkFDeEc7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILHlGQUF5RjtZQUN6RiwyRkFBMkY7WUFDM0Ysc0RBQXNEO1lBQ3RELHNCQUFzQixDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1lBQ25ELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLDRCQUE0QixHQUFHLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUNuQztJQUNMLENBQUM7SUFHTyx1QkFBdUI7UUFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxJQUFzQixFQUFFLFFBQWlCLEVBQUUsU0FBbUIsRUFBRSxpQkFBMkIsRUFDdkgsYUFBa0M7UUFDbEMsSUFBSSxhQUFhLEVBQUU7WUFDZixRQUFRLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssMkJBQTJCLENBQUMsUUFBUTtZQUMzRCxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDaEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRCxJQUFJLFFBQVEsRUFBRTtnQkFDVixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsU0FBUyxFQUFFO3dCQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUM5QztpQkFDSjthQUNKO2lCQUFNO2dCQUNILElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdkUsSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDWixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDaEQ7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFekIsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLDJCQUEyQixDQUFDLFFBQVEsRUFBRTtZQUM3RCxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3BCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQzlCLE9BQU8sV0FBVyxFQUFFO29CQUNoQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFOzRCQUNuQyxZQUFZLEdBQUcsS0FBSyxDQUFDOzRCQUNyQixNQUFNO3lCQUNUO3FCQUNKO29CQUNELFdBQVcsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO29CQUNwQyxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztpQkFDcEM7YUFDSjtZQUNELElBQUksQ0FBQyxDQUFDLGlCQUFpQixJQUFJLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTt3QkFDbkIsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7cUJBQzNCO29CQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDbkcsQ0FBQyxDQUFDLENBQUM7YUFDTjtTQUNKO0lBQ0wsQ0FBQztJQUVPLFlBQVk7UUFDaEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDakg7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0sscUJBQXFCLENBQUMsS0FBYztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ25ELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzlCLE9BQU87U0FDVjtRQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM5QyxJQUFJLEdBQWdCLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO2dCQUNqRCxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWE7cUJBQ3JDLGFBQWEsQ0FBQywrREFBK0QsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDN0YsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQzthQUN2QztZQUNELElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsd0RBQXdELENBQUMsQ0FBQztnQkFDbkgsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQzthQUM5RDtZQUVELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLGVBQWUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRixJQUFJLG1CQUFtQixFQUFFO2dCQUNyQixZQUFZLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDO2dCQUN2QyxlQUFlLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO2FBQ2hEO1lBRUQsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDZixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLElBQUksYUFBYSxFQUFFO29CQUNmLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO2lCQUM5QjtnQkFFRCxlQUFlLEdBQUcsTUFBTSxJQUFJLFlBQVksSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDO2FBQ3hFO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDaEQsNEZBQTRGO2dCQUM1RixnRUFBZ0U7Z0JBQ2hFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztnQkFDOUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM1QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELElBQUksYUFBYSxDQUFDLEdBQUcsR0FBRyxZQUFZLEVBQUU7d0JBQ2xDLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3BCLE1BQU07cUJBQ1Q7aUJBQ0o7YUFDSjtZQUVELElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksSUFBSSxDQUFDLG9DQUFvQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2xFLE1BQU0sSUFBSSxHQUFnQixHQUFHLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7b0JBQzNHLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvRCxpREFBaUQ7b0JBQ2pELGdDQUFnQztvQkFDaEMsSUFBSSxnQkFBZ0IsRUFBRTt3QkFDbEIsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7cUJBQzVCO3lCQUFNO3dCQUNILEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDZjtpQkFDSjtxQkFBTTtvQkFDSCxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ2Y7Z0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQ3REO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8saUJBQWlCLENBQUMsS0FBMkI7UUFDakQsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFO1lBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzNCLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUNwQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUN2QztZQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQ2hDO2FBQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLHdDQUF3QyxDQUFDO2VBQ3JHLEtBQUssQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsRUFBRTtZQUMxRSxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUVwQyxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRTtnQkFDakgsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0JBQ3ZCLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzVCLElBQUksQ0FBQyx5Q0FBeUMsR0FBRyxJQUFJLENBQUM7aUJBQ3pEO3FCQUFNO29CQUNILEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUM1QixNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDbkUsZUFBZSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUN2RCxLQUFLLENBQUMsV0FBVyxFQUNqQixvQkFBb0IsRUFDcEIsS0FBSyxDQUFDLFVBQVUsRUFDaEIsZ0JBQWdCLENBQUMsQ0FBQztpQkFDekI7YUFDSjtpQkFBTTtnQkFDSCxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7YUFDaEM7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLDZCQUE2QixDQUFDLCtCQUErQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdFO0lBQ0wsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNoQyxJQUFJLFlBQVksS0FBSyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtvQkFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3pDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxLQUFvQjtRQUM3QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNsQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDNUMsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxZQUFZLElBQUksWUFBWSxLQUFLLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO29CQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDekM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDN0I7YUFBTTtZQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN6QjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSx3QkFBd0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLG9CQUFvQixDQUFDLE1BQWdDLEVBQUUsWUFBbUM7UUFDN0YsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFO1lBQzVCLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BFO2FBQU07WUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0UsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ3RGO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFFSyx3QkFBd0I7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNuSCxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7YUFDOUQ7U0FDSjtRQUNELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUVLLDBCQUEwQixDQUFDLEtBQWM7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBRU8sd0NBQXdDO1FBQzVDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxRQUFRLEVBQUU7WUFDN0QsT0FBTztTQUNWO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDakIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUMvQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLE1BQU07aUJBQ1Q7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2YsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDdkQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuQyxNQUFNO3FCQUNUO2lCQUNKO3FCQUFNO29CQUNILElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuQyxNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxJQUFzQjtRQUNsRCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzlCLE9BQU8sV0FBVyxFQUFFO2dCQUNoQixNQUFNLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUN4RSxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQzthQUNwQztTQUNKO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLFNBQVM7UUFDYixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGdCQUFnQixDQUFDLHdCQUFtQztRQUN2RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsd0JBQXdCLENBQUM7UUFDcEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyx3QkFBbUMsRUFBRSxJQUF1QjtRQUN0RixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0QsTUFBTSxlQUFlLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQzdCLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUM3QyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDO2dCQUMvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDTixJQUFJLE1BQU0sRUFBRTtvQkFDUixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDbkMsSUFBSSxNQUFNLENBQUMsd0JBQXdCLEVBQUU7NEJBQ2pDLEtBQUssR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUN4RDt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFOzRCQUMzQixLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7eUJBQ2hEO3dCQUNELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUMvRCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBQ3BELE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0JBQ25GLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUM3RCxJQUFJLGVBQWU7NEJBQ2YsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxzQkFBc0IsQ0FBQyxjQUFjO21DQUM5RCxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRTs0QkFDekUsUUFBUSxlQUFlLENBQUMsT0FBTyxFQUFFO2dDQUM3QixLQUFLLGdCQUFnQixDQUFDLEVBQUU7b0NBQ3BCLElBQUksTUFBTSxDQUFDLHlCQUF5QixFQUFFO3dDQUNsQyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7NENBQ2pELEtBQUssR0FBRyxLQUFLLENBQUM7eUNBQ2pCO3FDQUNKO3lDQUFNO3dDQUNILGlGQUFpRjt3Q0FDakYsSUFBSSxlQUFlLEtBQUssZUFBZSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRTs0Q0FDMUUsS0FBSyxHQUFHLEtBQUssQ0FBQzt5Q0FDakI7cUNBQ0o7b0NBQ0QsTUFBTTtnQ0FDVixLQUFLLGdCQUFnQixDQUFDLEVBQUU7b0NBQ3BCLElBQUksQ0FBQyxjQUFjLElBQUksY0FBYyxLQUFLLENBQUMsQ0FBQzt3Q0FDeEMsQ0FBQyxjQUFjLElBQUksY0FBYyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dDQUMxQyxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFDLEVBQUU7NENBQ3JDLEtBQUssR0FBRyxLQUFLLENBQUM7eUNBQ2pCO3FDQUNKO29DQUNELE1BQU07Z0NBQ1YsS0FBSyxnQkFBZ0IsQ0FBQyxFQUFFO29DQUNwQixJQUFJLENBQUMsY0FBYyxJQUFJLGNBQWMsS0FBSyxDQUFDLENBQUM7MkNBQ3JDLENBQUMsY0FBYyxJQUFJLGNBQWMsS0FBSyxDQUFDLENBQUMsRUFBRTt3Q0FDN0MsSUFBSSxDQUFDLENBQUMsY0FBYyxJQUFJLGNBQWMsQ0FBQyxFQUFFOzRDQUNyQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3lDQUNqQjtxQ0FDSjtvQ0FDRCxNQUFNO2dDQUNWLEtBQUssZ0JBQWdCLENBQUMsRUFBRTtvQ0FDcEIsSUFBSSxDQUFDLENBQUMsZUFBZSxLQUFLLGVBQWUsQ0FBQyxFQUFFO3dDQUN4QyxLQUFLLEdBQUcsS0FBSyxDQUFDO3FDQUNqQjtvQ0FDRCxNQUFNO2dDQUNWO29DQUNJLGFBQWE7b0NBQ2IsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dDQUNqRCxLQUFLLEdBQUcsS0FBSyxDQUFDO3FDQUNqQjtvQ0FDRCxNQUFNOzZCQUNiO3lCQUNKOzZCQUFNLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssc0JBQXNCLENBQUMsbUJBQW1CLEVBQUU7NEJBQ2xGLElBQUksS0FBSyxFQUFFO2dDQUNQLEtBQUssR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQzdDLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQzs2QkFDbkU7eUJBQ0o7NkJBQU0sSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRTs0QkFDL0UsSUFBSSxLQUFLLEVBQUU7Z0NBQ1AsS0FBSyxHQUFHLElBQUksQ0FBQyxtQ0FBbUMsQ0FDNUMsd0JBQXdCLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDOzZCQUNuRTt5QkFDSjtxQkFDSjt5QkFBTTt3QkFDSCxLQUFLLEdBQUcsS0FBSyxDQUFDO3FCQUNqQjtpQkFDSjtxQkFBTTtvQkFDSCxLQUFLLEdBQUcsS0FBSyxDQUFDO2lCQUNqQjthQUNKO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sbUNBQW1DLENBQ3ZDLHdCQUFtQyxFQUFFLGVBQThCLEVBQUUsZUFBdUI7UUFDNUYsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDM0MsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLEtBQUssRUFDTCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvRCxNQUFNLElBQUksR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssc0JBQXNCLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7Z0JBQ25ILElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuRCxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRTt3QkFDbEMsR0FBRyxHQUFHLElBQUksQ0FBQzt3QkFDWCxNQUFNLEtBQUssQ0FBQztxQkFDZjtpQkFDSjthQUNKO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFTyxvQ0FBb0MsQ0FDeEMsd0JBQW1DLEVBQUUsZUFBOEIsRUFBRSxlQUF1QjtRQUU1RixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMzQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDaEIsS0FBSyxFQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9ELE1BQU0sSUFBSSxHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxzQkFBc0IsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRTtnQkFDdEgsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDM0UsSUFBSSxlQUFlLEtBQUssZUFBZSxFQUFFO3dCQUNyQyxHQUFHLEdBQUcsSUFBSSxDQUFDO3dCQUNYLE1BQU0sS0FBSyxDQUFDO3FCQUNmO2lCQUNKO2FBQ0o7U0FDSjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssd0JBQXdCLENBQUMsS0FBVSxFQUFFLEtBQVU7UUFDbkQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNsQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELGdEQUFnRDtRQUNoRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLEtBQUssRUFBRSxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDMUMsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO2dCQUNoQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQzdDLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNPLFdBQVc7UUFDakIsT0FBTztZQUNILGVBQWUsRUFBRSxFQUFFO1NBQ3RCLENBQUM7SUFDTixDQUFDOztBQTV2SWMsaUNBQWMsR0FBRyxFQUFFLENBQUM7QUFDcEIsOEJBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO3VHQUZ0QyxrQkFBa0I7b0dBQWxCLGtCQUFrQjs7b0NBb0xWLHdCQUF3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7dUJBVTNCLGdDQUFnQzs7Ozs7Ozs7Ozs7Ozs7OztRQ3pQbEQsaUNBRzJGLGdCQUFBLGFBQUE7UUFLckYsc0dBQVcsZ0NBQTRCLElBQUM7UUFDeEMsOEJBQytCO1FBQzdCLG1FQU1NO1FBQ1IsaUJBQU07UUFDTixvRUF1Qk07UUFDUixpQkFBTSxFQUFBLEVBQUE7UUFHVixpQ0FLd0MsbUJBQUE7UUFJcEMsc0VBTU07UUFDTixvQ0FBa0gsbUJBQUE7UUFJOUcsdUVBK0VNO1FBQ1IsaUJBQU07UUFDTixvQ0FDNkU7UUFDM0UsdUVBb0pNO1FBQ04sb0NBQW9DLGVBQUEsZUFBQTtRQUVKLHVCQUFNO1FBQUEsaUJBQU0sRUFBQSxFQUFBLEVBQUEsRUFBQTtRQUtoRCxzRUFDa0g7UUFDcEgsaUJBQU07UUFDTixzRUFHTTtRQUNSLGlCQUFNO1FBQ04sK0JBRU07O1FBMVRKLGlFQUFvRCw0REFBQSx3Q0FBQSx5Q0FBQSw2RkFBQTtRQVFqQixlQUFzRTtRQUF0RSwwRkFBc0U7UUFHaEcsZUFBcUU7UUFBckUsb0dBQXFFO1FBT2xELGVBQWtCO1FBQWxCLDJDQUFrQjtRQTRCOUMsZUFBMkQ7UUFBM0QsMEVBQTJELHdDQUFBLHdDQUFBLHlDQUFBLHNDQUFBLDZGQUFBLG9DQUFBO1FBTXpELGVBQXVHO1FBQXZHLHdGQUF1RztRQUdwRyxlQUE0QjtRQUE1QixpREFBNEI7UUFRM0IsZUFBMEM7UUFBMUMsbUZBQTBDO1FBQUMsbUNBQXlCO1FBRXRDLGVBQStCO1FBQS9CLHdEQUErQjtRQWlGUCxlQUF3RDtRQUF4RCxxRUFBd0Q7UUFDOUcsOEVBQXFDO1FBQ1AsZUFBb0M7UUFBcEMsNkRBQW9DO1FBNEpoRSxlQUF5QztRQUF6Qyw4REFBeUM7UUFJOUMsZUFBOEU7UUFBOUUsK0ZBQThFOztBRDRnRC9FO0lBQUMsS0FBSyxFQUFFOzs7O2tFQVVQO0FBMEtEO0lBQUMsUUFBUSxFQUFFOzs7O3dFQUlWO0FBc3pCRDtJQUFDLFFBQVEsRUFBRTs7OztzRkF5QlY7QUFzN0JEO0lBQUMsUUFBUSxFQUFFOzs7O2lEQUlWO0FBTUQ7SUFBQyxLQUFLLEVBQUU7Ozs7bUVBT1A7QUFFRDtJQUFDLEtBQUssRUFBRTs7Ozt5REFnRVA7QUFFRDtJQUFDLFFBQVEsRUFBRTs7OztpRUFHVjtBQW1QRDtJQUFDLEtBQUssRUFBRTs7OztrRUFTUDtBQU9EO0lBQUMsUUFBUSxFQUFFOzs7O29FQUdWO3VGQWppSVEsa0JBQWtCO2NBSjlCLFNBQVM7MkJBQ0ksZ0JBQWdCOzJEQThGbEIsZ0JBQWdCO2tCQUR2QixTQUFTO21CQUFDLGtCQUFrQjtZQUlyQixhQUFhO2tCQURwQixTQUFTO21CQUFDLFFBQVE7WUFJWCxrQkFBa0I7a0JBRHpCLFNBQVM7bUJBQUMsYUFBYTtZQUloQixjQUFjO2tCQURyQixTQUFTO21CQUFDLFNBQVM7WUFJWixzQkFBc0I7a0JBRDdCLFNBQVM7bUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBSXRDLGNBQWM7a0JBRHJCLFNBQVM7bUJBQUMsU0FBUztZQUlaLGlCQUFpQjtrQkFEeEIsU0FBUzttQkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBSWpDLHNCQUFzQjtrQkFEN0IsU0FBUzttQkFBQyxpQkFBaUI7WUFJcEIsaUJBQWlCO2tCQUR4QixTQUFTO21CQUFDLFlBQVk7WUFJZixtQkFBbUI7a0JBRDFCLFNBQVM7bUJBQUMsY0FBYztZQUlqQiwwQkFBMEI7a0JBRGpDLFNBQVM7bUJBQUMsNEJBQTRCO1lBSWhDLG1CQUFtQjtrQkFEekIsWUFBWTttQkFBQyxPQUFPO1lBT0Esa0JBQWtCO2tCQUF0QyxNQUFNO1lBR1UsZ0JBQWdCO2tCQUFoQyxNQUFNO1lBTUEsZUFBZTtrQkFEckIsTUFBTTtZQU1VLHFDQUFxQztrQkFBckQsTUFBTTtZQU1jLGFBQWE7a0JBQWpDLE1BQU07WUFHVSxXQUFXO2tCQUEzQixNQUFNO1lBTWMsb0JBQW9CO2tCQUF4QyxNQUFNO1lBR1UsZ0JBQWdCO2tCQUFoQyxNQUFNO1lBTWMscUJBQXFCO2tCQUF6QyxNQUFNO1lBR1UsZ0JBQWdCO2tCQUFoQyxNQUFNO1lBVUksT0FBTztrQkFEakIsZUFBZTttQkFBQyx3QkFBd0I7WUFXakMsaUNBQWlDO2tCQUR4QyxZQUFZO21CQUFDLGdDQUFnQztZQThCdkMsbUJBQW1CO2tCQUR6QixNQUFNO1lBT0EsTUFBTTtrQkFEWixLQUFLO1lBT0Msc0JBQXNCO2tCQUQ1QixLQUFLO1lBT0MsY0FBYztrQkFEcEIsS0FBSztZQU9DLGVBQWU7a0JBRHJCLEtBQUs7WUFJQyxRQUFRO2tCQURkLEtBQUs7WUFPQyx1QkFBdUI7a0JBRDdCLEtBQUs7WUFPQyx3QkFBd0I7a0JBRDlCLEtBQUs7WUFPQyxvQkFBb0I7a0JBRDFCLEtBQUs7WUFPQyxlQUFlO2tCQURyQixNQUFNO1lBUWMsWUFBWTtrQkFBaEMsTUFBTTtZQUdVLFlBQVk7a0JBQTVCLE1BQU07WUFPYyxlQUFlO2tCQUFuQyxNQUFNO1lBR1UsYUFBYTtrQkFBN0IsTUFBTTtZQU9jLFlBQVk7a0JBQWhDLE1BQU07WUFHVSxZQUFZO2tCQUE1QixNQUFNO1lBTUEsUUFBUTtrQkFEZCxLQUFLO1lBT0Msc0JBQXNCO2tCQUQ1QixLQUFLO1lBT0MsaUJBQWlCO2tCQUR2QixLQUFLO1lBU0MsK0JBQStCO2tCQURyQyxLQUFLO1lBUUMsdUJBQXVCO2tCQUQ3QixLQUFLO1lBUUMsa0JBQWtCO2tCQUR4QixLQUFLO1lBU0MscUJBQXFCO2tCQUQzQixLQUFLO1lBa0NDLG1DQUFtQztrQkFEekMsS0FBSztZQU9LLFlBQVk7a0JBRHRCLEtBQUs7WUFxREMsbUJBQW1CO2tCQUR6QixLQUFLO1lBT0MsVUFBVTtrQkFEaEIsS0FBSztZQU9DLG1CQUFtQjtrQkFEekIsS0FBSztZQU9LLEtBQUs7a0JBRGYsS0FBSztZQTRRQyxXQUFXO2tCQURqQixNQUFNO1lBaUJJLFNBQVM7a0JBRG5CLEtBQUs7WUE4Q0ssYUFBYTtrQkFEdkIsS0FBSztZQXVCQyxpQkFBaUI7a0JBRHZCLEtBQUs7WUFJQyxlQUFlO2tCQURyQixLQUFLO1lBVWUsUUFBUTtrQkFBNUIsTUFBTTtZQUdVLE1BQU07a0JBQXRCLE1BQU07WUFHQSxZQUFZO2tCQURsQixNQUFNO1lBUWMsV0FBVztrQkFBL0IsTUFBTTtZQUdVLFdBQVc7a0JBQTNCLE1BQU07WUFPYyxhQUFhO2tCQUFqQyxNQUFNO1lBR1UsYUFBYTtrQkFBN0IsTUFBTTtZQU1JLFdBQVc7a0JBRHJCLEtBQUs7WUFzQkssYUFBYTtrQkFEdkIsS0FBSztZQWVDLGNBQWM7a0JBRHBCLEtBQUs7WUFPQyxVQUFVO2tCQURoQixLQUFLO1lBT0ssbUJBQW1CO2tCQUQ3QixLQUFLO1lBYUssY0FBYztrQkFEeEIsS0FBSztZQWFDLFFBQVE7a0JBRGQsS0FBSztZQU9DLG1CQUFtQjtrQkFEekIsS0FBSztZQU9DLGNBQWM7a0JBRHBCLEtBQUs7WUFPQyxTQUFTO2tCQURmLEtBQUs7WUFRQyw0QkFBNEI7a0JBRGxDLEtBQUs7WUFPQyxvQ0FBb0M7a0JBRDFDLEtBQUs7WUFPQyxVQUFVO2tCQURoQixLQUFLO1lBT0MsdUJBQXVCO2tCQUQ3QixLQUFLO1lBT0MsVUFBVTtrQkFEaEIsS0FBSztZQVFDLGtCQUFrQjtrQkFEeEIsS0FBSztZQU9DLDBCQUEwQjtrQkFEaEMsS0FBSztZQUlDLGFBQWE7a0JBRG5CLEtBQUs7WUE0eUJFLHdCQUF3QixNQW9MeEIsOEJBQThCLE1BNmQzQixZQUFZO2tCQUR0QixLQUFLO1lBOFZDLDRDQUE0QyxNQSs4QjVDLE9BQU8sTUFVTix5QkFBeUIsTUFTekIsZUFBZSxNQWtFZix1QkFBdUIsTUFzUHZCLHdCQUF3QixNQWdCeEIsMEJBQTBCO0FBaU90Qzs7R0FFRztBQU1ILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxrQkFBa0I7SUFTdEQsWUFBWSxRQUFrQjtRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQVhEOztPQUVHO0lBQ0gsSUFBYyxhQUFhO1FBQ3ZCLE9BQU8sb0JBQW9CLENBQUM7SUFDaEMsQ0FBQztJQVFTLHFCQUFxQjtRQUMzQixPQUFPLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN4QyxnQkFBZ0I7U0FDbkIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7dUdBbkJRLGtCQUFrQjtvR0FBbEIsa0JBQWtCO1FDbjBJL0IsaUNBRzJGLGdCQUFBLGFBQUE7UUFLckYsc0dBQVcsZ0NBQTRCLElBQUM7UUFDeEMsOEJBQytCO1FBQzdCLG1FQU1NO1FBQ1IsaUJBQU07UUFDTixvRUF1Qk07UUFDUixpQkFBTSxFQUFBLEVBQUE7UUFHVixpQ0FLd0MsbUJBQUE7UUFJcEMsc0VBTU07UUFDTixvQ0FBa0gsbUJBQUE7UUFJOUcsdUVBK0VNO1FBQ1IsaUJBQU07UUFDTixvQ0FDNkU7UUFDM0UsdUVBb0pNO1FBQ04sb0NBQW9DLGVBQUEsZUFBQTtRQUVKLHVCQUFNO1FBQUEsaUJBQU0sRUFBQSxFQUFBLEVBQUEsRUFBQTtRQUtoRCxzRUFDa0g7UUFDcEgsaUJBQU07UUFDTixzRUFHTTtRQUNSLGlCQUFNO1FBQ04sK0JBRU07O1FBMVRKLGlFQUFvRCw0REFBQSx3Q0FBQSx5Q0FBQSw2RkFBQTtRQVFqQixlQUFzRTtRQUF0RSwwRkFBc0U7UUFHaEcsZUFBcUU7UUFBckUsb0dBQXFFO1FBT2xELGVBQWtCO1FBQWxCLDJDQUFrQjtRQTRCOUMsZUFBMkQ7UUFBM0QsMEVBQTJELHdDQUFBLHdDQUFBLHlDQUFBLHNDQUFBLDZGQUFBLG9DQUFBO1FBTXpELGVBQXVHO1FBQXZHLHdGQUF1RztRQUdwRyxlQUE0QjtRQUE1QixpREFBNEI7UUFRM0IsZUFBMEM7UUFBMUMsbUZBQTBDO1FBQUMsbUNBQXlCO1FBRXRDLGVBQStCO1FBQS9CLHdEQUErQjtRQWlGUCxlQUF3RDtRQUF4RCxxRUFBd0Q7UUFDOUcsOEVBQXFDO1FBQ1AsZUFBb0M7UUFBcEMsNkRBQW9DO1FBNEpoRSxlQUF5QztRQUF6Qyw4REFBeUM7UUFJOUMsZUFBOEU7UUFBOUUsK0ZBQThFOzt1RkQ4Z0l0RSxrQkFBa0I7Y0FKOUIsU0FBUzsyQkFDSSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIENvbnRlbnRDaGlsZCxcclxuICAgIENvbnRlbnRDaGlsZHJlbixcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbmplY3RvcixcclxuICAgIElucHV0LFxyXG4gICAgTmdab25lLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBWaWV3Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGVib3VuY2UgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy9kZWJvdW5jZS5kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgWWllbGQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy95aWVsZC5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBFbGVtZW50Rm9jdXNpbmdFdmVudCwgS2V5Q29kZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9hY2Nlc3NpYmlsaXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBDb3JlRW52aXJvbm1lbnQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvY29yZS1lbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2ctbGV2ZWwnO1xyXG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2dnaW5nJztcclxuaW1wb3J0IHsgRG9tIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kb20vZG9tJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExheW91dCwgU01FX0xBWU9VVF9QUk9WSURFUiB9IGZyb20gJy4uL2NvbW1vbi9sYXlvdXQnO1xyXG5pbXBvcnQgeyBTcGFjZXJCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vY29tbW9uL3NwYWNlci1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1GaWVsZENvbnRhaW5lciB9IGZyb20gJy4uL2Zvcm0vZm9ybS1maWVsZC9mb3JtLWZpZWxkLWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IFNlYXJjaEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS1maWVsZC9zZWFyY2gvc2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUXVlcnlEYXRhLCBRdWVyeURhdGFJdGVtLCBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLCBRdWVyeURhdGFPcGVyYW5kIH0gZnJvbSAnLi4vcXVlcnktZWRpdG9yL3F1ZXJ5LWVkaXRvci1jb250cmFjdCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWFjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICAgIERhdGFUYWJsZUN1c3RvbVNvcnRFdmVudCxcclxuICAgIERhdGFUYWJsZURhdGFJdGVtLFxyXG4gICAgRGF0YVRhYmxlTGF6eUxvYWRFdmVudCxcclxuICAgIERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZSxcclxuICAgIERhdGFUYWJsZVJlbmRlcmVkSXRlbSxcclxuICAgIERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUsXHJcbiAgICBEYXRhVGFibGVTb3J0TW9kZSxcclxuICAgIEVkaXRhYmxlRGF0YUNoYW5nZVNldCxcclxuICAgIEVkaXRhYmxlRGF0YUl0ZW0sXHJcbiAgICBOb2RlTmF2aWdhdGluZ1Rhc2ssXHJcbiAgICBUcmVlTm9kZURhdGFJdGVtXHJcbn0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbnRyYWN0JztcclxuaW1wb3J0IHsgRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtcmVzcG9uc2l2ZS13aW5kb3ctbWFuYWdlcic7XHJcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQeENvbnZlcnRlciB9IGZyb20gJy4vaGVscGVycy9weC1jb252ZXJ0ZXInO1xyXG5cclxuLyoqXHJcbiAqIERhdGEgdGFibGUgY29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWRhdGEtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBTcGFjZXJCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWluQ29sdW1uV2lkdGggPSA1MDtcclxuICAgIHByaXZhdGUgc3RhdGljIHB4Q29udmVydGVyID0gbmV3IFB4Q29udmVydGVyKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0RhdGFUYWJsZUNvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0NvbXBvbmVudEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGVkaXRhYmxlRGF0YUNoYW5nZVNldDogRWRpdGFibGVEYXRhQ2hhbmdlU2V0ID0ge1xyXG4gICAgICAgIGFkZGVkSXRlbXM6IFtdLFxyXG4gICAgICAgIHVwZGF0ZWRJdGVtczogW10sXHJcbiAgICAgICAgZGVsZXRlZEl0ZW1zOiBbXVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGRlZmF1bHRTY3JvbGxQaXhlbHMgPSA5MDtcclxuICAgIHByaXZhdGUgZGVmYXVsdFNjcm9sbFBlcmNlbnRhZ2UgPSAwLjQ7XHJcbiAgICBwcml2YXRlIG1heEFjdHVhbFNjcm9sbERhdGFFbGVtZW50SGVpZ2h0ID0gNTAwMDAwO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJEZWJvdW5jZVRpbWVvdXQgPSAzMDA7XHJcbiAgICBwcml2YXRlIGtleWJvYXJkTmF2aWdhdGlvbkRlYm91bmNlVGltZW91dCA9IDEwMDtcclxuICAgIHByaXZhdGUgc2Nyb2xsQ2hlY2tJbnRlcnZhbER1cmF0aW9uID0gMzAwO1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxDaGVja0ludGVydmFsO1xyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGJ1ZmZlclJvd1JhdGUgPSAxO1xyXG4gICAgcHJpdmF0ZSBldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcclxuICAgIHByaXZhdGUgc29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBwcmV2aW91c1NvcnRDb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudDtcclxuICAgIHByaXZhdGUgaW50ZXJuYWxJdGVtczogRGF0YVRhYmxlRGF0YUl0ZW1bXTtcclxuICAgIHByaXZhdGUgYWN0dWFsSXRlbXM6IERhdGFUYWJsZURhdGFJdGVtW107XHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50SGFzVmVydGljYWxPdmVyZmxvdzogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZmlsdGVyRGVib3VuY2VUaW1lcjtcclxuICAgIHByaXZhdGUgdHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXI7XHJcbiAgICBwcml2YXRlIG9sZEZpbHRlcktleXdvcmQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgZmlsdGVyS2V5d29yZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEdsb2JhbEZpbHRlcjogYW55O1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGlzU2Nyb2xsaW5nOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBpc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkaXNwbGF5SXRlbXNUb3A6IG51bWJlcjtcclxuICAgIHByaXZhdGUgaW50ZXJuYWxSZW5kZXJlZEl0ZW1zOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFNlbGVjdGlvbjogRGF0YVRhYmxlRGF0YUl0ZW1bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBoYXNMb25nTGlzdDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0ID0gLTE7XHJcbiAgICBwcml2YXRlIGRhdGFTY3JvbGxUb3A6IG51bWJlcjtcclxuICAgIHByaXZhdGUgY3VycmVudFJlbmRlcmVkSXRlbUluVmlld1BvcnQ6IERhdGFUYWJsZVJlbmRlcmVkSXRlbTtcclxuICAgIHByaXZhdGUgaW50ZXJuYWxHcm91cENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEdyb3VwU29ydE1vZGUgPSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFNlbGVjdGlvbk1vZGU6IHN0cmluZyB8IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZTtcclxuICAgIHByaXZhdGUgc2hhZG93VHJlZTogYW55OyAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gbWFpbnRhaW4gdGhlIHRyZWUgdG8gaGVscCBkbyB0aGUgXCJzYW1lIGxldmVsIG9ubHlcIiBzb3J0LlxyXG4gICAgcHJpdmF0ZSBhY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBwcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIGFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIHJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgcmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgcHJpdmF0ZSB1bnJlZ2lzdGVyT25FbGVtZW50Rm9jdXNpbmdFdmVudEhhbmRsZXI6ICgpID0+IHZvaWQ7XHJcbiAgICBwcml2YXRlIGNvbnRlbnRBcmVhSGFzRm9jdXMgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBjYW5jZWxMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzT25jZSA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBsYXlvdXRDaGFuZ2VTdWJzY3JpYmVyO1xyXG4gICAgcHJpdmF0ZSBnbG9iYWxGaWx0ZXJTdWJzY3JpYmVyO1xyXG4gICAgcHJpdmF0ZSBncm91cEtleXM6IHsgW2tleTogc3RyaW5nXTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW10gfSA9IHt9O1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbENvbHVtbnM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ+O1xyXG4gICAgcHJpdmF0ZSB0cmVlVG9nZ2xlU3RhdHVzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gICAgcHJpdmF0ZSBzaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFF1ZXJ5RWRpdG9yOiBRdWVyeURhdGE7XHJcbiAgICBwcml2YXRlIGFjdHVhbENvbHVtblByb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzRW1wdHlNZXNzYWdlQ291bnQgPSAzO1xyXG4gICAgcHJpdmF0ZSBhY2Nlc3NpYmlsaXR5TWFuYWdlciA9IENvcmVFbnZpcm9ubWVudC5hY2Nlc3NpYmlsaXR5TWFuYWdlcjtcclxuXHJcbiAgICBwcml2YXRlIGludGVybmFsVGFibGVBcmlhTGFiZWxsZWRCeTogc3RyaW5nO1xyXG4gICAgcHVibGljIGludGVybmFsVGFibGVBcmlhTGFiZWw6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc2Nyb2xsRGF0YVN0eWxlVG9wOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgc2Nyb2xsQWJvdmVEYXRhU3R5bGVUb3A6IHN0cmluZztcclxuICAgIHB1YmxpYyBpc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgcHVibGljIGRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyID0gbmV3IERhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyKCk7XHJcbiAgICBwdWJsaWMgRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXI6IERhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyO1xyXG4gICAgcHVibGljIGNvbHVtblNvcnRTZXR0aW5ncyA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzZWxlY3RlZCBub2RlIGZyb20gdGhlIHRhYmxlIGlzIGNvbGxhcHNlZCBmcm9tIHRoZSBwYXJlbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RlZFRyZWVOb2RlUGFyZW50Q29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgncmVzaXplckluZGljYXRvcicpXHJcbiAgICBwcml2YXRlIHJlc2l6ZXJJbmRpY2F0b3I6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyJylcclxuICAgIHByaXZhdGUgaGVhZGVyRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdoZWFkZXJUYWJsZScpXHJcbiAgICBwcml2YXRlIGhlYWRlclRhYmxlRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdjb250ZW50JylcclxuICAgIHByaXZhdGUgY29udGVudEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCd0ZW1wUm93JylcclxuICAgIHByaXZhdGUgdGVtcFJvd0VsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQm9keScsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICBwcml2YXRlIHNjcm9sbEJvZHlFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbEFib3ZlRGF0YScpXHJcbiAgICBwcml2YXRlIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsRGF0YScpXHJcbiAgICBwcml2YXRlIHNjcm9sbERhdGFFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5TWVzc2FnZScpXHJcbiAgICBwcml2YXRlIGVtcHR5TWVzc2FnZUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnbGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQnKVxyXG4gICAgcHJpdmF0ZSBsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAQ29udGVudENoaWxkKCdncm91cCcpXHJcbiAgICBwdWJsaWMgZ3JvdXBIZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnY2hhbmdlc2V0VXBkYXRlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uQ2hhbmdlc2V0VXBkYXRlZCgpOiBFdmVudEVtaXR0ZXI8RWRpdGFibGVEYXRhQ2hhbmdlU2V0PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlc2V0VXBkYXRlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlc2V0VXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RWRpdGFibGVEYXRhQ2hhbmdlU2V0PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGNoYW5naW5nIGlzIGhhcHBlbmluZy5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVEYXRhSXRlbT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRydWUgd2hlbiB0YWJsZSBpcyByZW5kZXJlZCB3aXRoIG1pbi1oZWlnaHQgb24gcGhvbmUgZG93blxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGlzVGFibGVSZW5kZXJlZFdpdGhNaW5IZWlnaHRQaG9uZURvd246IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAncm93RGJsY2xpY2snIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblJvd0RibGNsaWNrKCk6IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dEYmxjbGljaztcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcm93RGJsY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnZ3JvdXBUb2dnbGVDbGljaycgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uR3JvdXBUb2dnbGVDbGlja2VkKCk6IEV2ZW50RW1pdHRlcjx7IGdyb3VwRGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwVG9nZ2xlQ2xpY2s7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdyb3VwVG9nZ2xlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZ3JvdXBEYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdlZGl0YWJsZVJvd0FkZGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25OZXdFZGl0YWJsZVJvd0FkZGVkKCk6IEV2ZW50RW1pdHRlcjx7IGRhdGE6IGFueSwgb3ZlcnJpZGVOZXdEYXRhSGFuZGxlcjogKGRhdGE6IGFueSkgPT4gdm9pZCB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGVSb3dBZGRlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZWRpdGFibGVSb3dBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIG92ZXJyaWRlTmV3RGF0YUhhbmRsZXI6IChkYXRhOiBhbnkpID0+IHZvaWQgfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgY29sdW1ucyByZW5kZXJlZCBvbiB0aGUgVUkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY29sdW1ucygpOiBRdWVyeUxpc3Q8RGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxDb2x1bW5zO1xyXG4gICAgfVxyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KVxyXG4gICAgcHVibGljIHNldCBjb2x1bW5zKHZhbHVlOiBRdWVyeUxpc3Q8RGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50Pikge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb2x1bW5zID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGRyZW4oRGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnQpXHJcbiAgICBwcml2YXRlIGRhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50czogUXVlcnlMaXN0PERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgYWN0dWFsIGNvbHVtbnMgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0YWJsZS5cclxuICAgICAqIEluIGdyb3VwaW5nIGRhdGEgdGFibGUgc2NlbmFyaW8sIHRoZSBhY3R1YWwgY29sdW1ucyBkb2Vzbid0IGNvbnRhaW4gdGhlIGdyb3VwaW5nIGNvbHVtbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbENvbHVtbnM6IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBpdGVtIHJlbmRlcmVkIG9uIHRoZSBVSSAoaW5jbHVkaW5nIHRoZSBpdGVtcyBpbiBhbmQgb3V0c2lkZSBvZiB2aWV3IHBvcnQpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJlbmRlcmVkSXRlbXMoKTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsUmVuZGVyZWRJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHJlbmRlcmVkSXRlbXModmFsdWU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFJlbmRlcmVkSXRlbXMgPSB2YWx1ZSB8fCBbXTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNDaGFuZ2UuZW1pdCgpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXJvd2NvdW50JywgdmFsdWUubGVuZ3RoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyZWRJdGVtczogRGF0YVRhYmxlRGF0YUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHJlbmRlcmVkIGl0ZW1zIGFyZSBjaGFuZ2VkLlxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBiYWNrZ3JvdW5kIGJ1c3kgdGFza3MuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXNCdXN5OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSByaWdodCBjbGljayBzZWxlY3RcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlbmFibGVSaWdodENsaWNrU2VsZWN0ID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIG1lc3NhZ2Ugc2hvd2luZyB3aGVuIHRoZSBkYXRhIGlzIGxvYWRpbmcuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbG9hZGluZ01lc3NhZ2U6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgbWVzc2FnZSBzaG93aW5nIHdoZW4gdGhlIGRhdGEgbG9hZGluZyBpcyBmaW5pc2hlZCBidXQgdGhlIGRhdGEgaXMgZW1wdHkgb3Igbm8gZGF0YSBnb3QgcmVuZGVyZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbm9SZWNvcmRNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlZGl0YWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGV4cGFuZCB0cmVlIG5vZGUgb24gcm9vdCBub2RlIGNoZWNrZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHRyZWUgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZXhwYW5kVHJlZU5vZGVPbkNoZWNrZWQgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgYWxsIGVkaXRhYmxlIHJvd3MgaW4gYW4gZWRpdGFibGUgdGFibGUgc2hvdWxkIGJlIHZpc2libGUgKHJlZ2FyZGxlc3Mgb2YgaG92ZXIvc2VsZWN0ZWQgc3RhdGUpLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlzQWxsRWRpdGFibGVSb3dzVmlzaWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICogSXQgaW5kaWNhdGVzIHRoYXQgYSBzY3JvbGxiYXIgY2FuIGJlIHVzZWQgd2hlbiB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbHVtbnMgaXMgaHVnZVxyXG4gICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2Nyb2xsYWJsZUhvcml6b250YWwgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGF0IGEgZGF0YSBsYXp5IGxvYWRpbmcgbmVlZHMgdG8gaGFwcGVuIGFuZCByZXF1aXJlIHRoZSBjb25zdW1lciB0byBwcm92aWRlIGRhdGEgZm9yIHRoZSBsYXp5IGxvYWRpbmcgcGFydC5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgbGF6eUxvYWRpbmdEYXRhOiBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlTGF6eUxvYWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUxhenlMb2FkRXZlbnQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCB0cmlnZ2VycyB3aGVuIGEgdHJlZSBub2RlIGlzIGV4cGFuZGVkLlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdub2RlRXhwYW5kZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbk5vZGVFeHBhbmQoKTogRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUV4cGFuZGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBjb2xsYXBzZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVDb2xsYXBzZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbk5vZGVDb2xsYXBzZWQoKTogRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUNvbGxhcHNlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbm9kZUNvbGxhcHNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCB0cmlnZ2VycyB3aGVuIGEgdHJlZSBub2RlIGlzIHNlbGVjdGVkLlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdub2RlU2VsZWN0ZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbk5vZGVTZWxlY3QoKTogRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZVNlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBkYXRhIGlzIGxvYWRlZCBpbiBsYXp5IGxvYWRpbmcgd2F5LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxhenlMb2FkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gcmVtZW1iZXIgdGhlIHRyZWUgdG9nZ2xlIHN0YXR1cy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZW1lbWJlclRyZWVOb2RlVG9nZ2xlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gcmVtZW1iZXIgdGhlIHNlbGVjdGlvbiB0aGVuIGFmdGVyIHRoZSB3aG9sZSBkYXRhIHNvdXJjZSBpcyByZWZyZXNoZWQgdGhlIHNlbGVjdGlvbiB3aWxsIHN0aWxsIGJlIHRoZXJlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJlbWVtYmVyU2VsZWN0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGx5IHRoZSBlbnRlciBrZXkgb24gYSByb3cgcmVkaXJlY3RzIHRvIHRoZSBkb3VibGUgY2xpY2sgYmVoYXZpb3Igb2YgdGhlIHJvdy5cclxuICAgICAqIElmIHRoaXMgZmxhZyBpcyB0cnVlLCB0aGVuIGRhdGEgdGFibGUgd291bGQgZG8gbm90aGluZyBmb3IgZW50ZXIga2V5IG9uIGEgcm93LlxyXG4gICAgICogVGhlbiB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGVudGVyIGtleSBhY3Rpb24gYnkgeW91ciBzZWxmLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHByZXZlbnRFbnRlcktleUZvckRlZmF1bHRBY3Rpb246IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBwb2ludHMgdG8gdGhlIGV4dGVybmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuIHVuaXF1ZSBpZGVudGl0eSBzdHJpbmcgZm9yIGFueSBkYXRhIGl0ZW0uXHJcbiAgICAgKiBTb21lIHNjZW5hcmlvcyBsaWtlIHRyZWUgdGFibGUgd291bGQgbmVlZCB0aGlzIGZ1bmN0aW9uIHRvIHJlbWVtYmVyIHRvZ2dsZSBzdGF0dXMgZm9yIGFueSB0cmVlIG5vZGUgYnkgdGhlIGlkZW50aXR5LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uOiAoZGF0YTogYW55KSA9PiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCeSBkZWZhdWx0IG5hdHVyYWwgc29ydCBpcyB0dXJuZWQgb24uXHJcbiAgICAgKiBCdXQgZm9yIHBlcmZvcm1hbmNlIGNvbmNlcm4sIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIG5hdHVyYWwgc29ydCBhbmQganVzdCBkbyB2ZXJ5IHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvbi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkaXNhYmxlTmF0dXJhbFNvcnQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERvbid0IGVuYWJsZSBkZWZhdWx0IHRvb2x0aXBzIGFsbCBvdmVyIFdBQyBieSBkZWZhdWx0LlxyXG4gICAgICogVE9ETzogSW52ZXN0aWdhdGUgZWFjaCBjYXNlIG9mIGRhdGEgdGFibGUgdXNhZ2UgYW5kIHNlZSBpZiBjYW4gdXBkYXRlIGFzIG5lZWRlZCB0byBhbGxvdyB0aGlzIHRvIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC5cclxuICAgICAqIEVuYWJsaW5nIGJ5IGRlZmF1bHQgcHJlLUdBIGlzIHJpc2t5IGFuZCBtYXkgaW50cm9kdWNlIHJlZ3Jlc3Npb25zIHRob3VnaC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlbmFibGVEZWZhdWx0VG9vbHRpcHMgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgaXRlbXMgcmVuZGVyZWQgYWJvdmUgdGhlIHZpZXcgcG9ydC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0OiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgaXRlbXMgcmVuZGVyZWQgaW4gYW5kIGJlbG93IHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0OiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlIGlzIHNjcm9sbGVkIGRvd24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc1Njcm9sbGVkRG93bjogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlIHNob3VsZCBoYW5kbGUgc2Nyb2xsaW5nIGZvciBjb250ZW50LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvdWxkU2Nyb2xsOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxhc3QgZm9jdXNhYmxlIHNoYWRvdyBlbGVtZW50IHNob3VsZCBiZSB1c2VkLlxyXG4gICAgICogTm9ybWFsbHkgd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCxcclxuICAgICAqIHRoZSBsYXN0IGZvY3VzYWJsZSBlbGVtZW50IG5lZWQgdG8gYmUgdXNlZCB0byBoYW5kbGUgZm9jdXMgbW92ZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG91bGRVc2VMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudDogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNjcm9sbCB0byBzZWxlY3Rpb24gYWZ0ZXIgc29ydGluZy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG91bGRTY3JvbGxUb1NlbGVjdGlvbkFmdGVyU29ydGluZzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIGdsb2JhbCBmaWx0ZXIgdmFsdWUgaHRtbCBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBnbG9iYWxGaWx0ZXIoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEdsb2JhbEZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdsb2JhbEZpbHRlcihnbG9iYWxGaWx0ZXI6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50SGFuZGxlciA9IChldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbHRlckRlYm91bmNlVGltZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvU2VhcmNoKGdsb2JhbEZpbHRlclsndmFsdWUnXSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJEZWJvdW5jZVRpbWVvdXQpO1xyXG4gICAgICAgIH0pLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRvU2VhcmNoID0gKGtleXdvcmQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcktleXdvcmQgPSBrZXl3b3JkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJLZXl3b3JkICE9PSB0aGlzLm9sZEZpbHRlcktleXdvcmQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyLmVtaXQodGhpcy5maWx0ZXJLZXl3b3JkKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm9sZEZpbHRlcktleXdvcmQgPSB0aGlzLmZpbHRlcktleXdvcmQ7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbEdsb2JhbEZpbHRlciA9IGdsb2JhbEZpbHRlcjtcclxuICAgICAgICBpZiAoZ2xvYmFsRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWxGaWx0ZXIgaW5zdGFuY2VvZiBTZWFyY2hGb3JtRmllbGRDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyU3Vic2NyaWJlciA9IGdsb2JhbEZpbHRlci5zZWFyY2guc3Vic2NyaWJlKGtleXdvcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5zZWFyY2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb1NlYXJjaChrZXl3b3JkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZXZlbnRIYW5kbGVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIGV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBhbmQgc2V0cyB0aGUgQ2FzZSBTZW5zaXRpdmUgZmxhZyBmb3IgZmlsdGVyaW5nLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGNhc2VTZW5zaXRpdmVGaWx0ZXI6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSB0cmVlIGRhdGEgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0FzVHJlZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgaXRlbVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGVkaXRhYmxlTmV3RGF0YUl0ZW06IERhdGFUYWJsZURhdGFJdGVtO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBhbmQgc2V0cyB0aGUgZGF0YSBzb3VyY2Ugb2YgdGhlIGRhdGEgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IERhdGFUYWJsZURhdGFJdGVtW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlID8gdGhpcy5pbnRlcm5hbEl0ZW1zLm1hcChpdGVtID0+IGl0ZW0uY29udGVudCkgOiB0aGlzLmludGVybmFsSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBpdGVtcyh2YWx1ZTogRGF0YVRhYmxlRGF0YUl0ZW1bXSkge1xyXG4gICAgICAgIGlmICghdGhpcy5yZW1lbWJlclNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodEZyb21Sb3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYWN0dWFsSXRlbXMgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgbGV0IGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHJlZmFjdG9yIHRvIHJlZHVjZSB0aGUgbmVzdGVkIGlmIGJsb2Nrcy5cclxuICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbikge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlcjogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbikgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIucHVzaCh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0uZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5wdXNoKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oaXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyID0gdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbih0aGlzLnNlbGVjdGlvbi5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIgPSB0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKHRoaXMuc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1zZnRTbWUubmV3R3VpZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQWxlcnRzOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uICYmIHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNUb1Byb2Nlc3MgPSB0aGlzLml0ZW1zLnNsaWNlKDApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZXNUb1Byb2Nlc3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Byb2Nlc3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnNwbGljZSgwLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIuaW5kZXhPZih0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGN1cnJlbnROb2RlLmRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihjdXJyZW50Tm9kZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudCA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5pbmRleE9mKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oaXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbklkZW50aXR5VG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZXNUb1Byb2Nlc3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Byb2Nlc3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnNwbGljZSgwLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGN1cnJlbnROb2RlLmRhdGEpID09PSBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gY3VycmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGZvdW5kIGluIHRoZSByZWZyZXNoIGl0ZW1zLCB0aGVuIGl0IG1lYW5zIHRoZSBzZWxlY3Rpb24gaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3MucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0pID09PSBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZm91bmQgaW4gdGhlIHJlZnJlc2ggaXRlbXMsIHRoZW4gaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXI6IERhdGFUYWJsZURhdGFJdGVtO1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyOiBEYXRhVGFibGVEYXRhSXRlbVtdID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5yZW1lbWJlclNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3Rpb24pICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIucHVzaChpdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5zZWxlY3Rpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyID0gdGhpcy5zZWxlY3Rpb24uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyID0gdGhpcy5zZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1zZnRTbWUubmV3R3VpZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQWxlcnRzOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaW50ZXJuYWxJdGVtcy5zbGljZSgwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5pbmRleE9mKGN1cnJlbnROb2RlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGN1cnJlbnROb2RlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnQgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZXNUb1Byb2Nlc3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Byb2Nlc3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnNwbGljZSgwLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5kYXRhID09PSBzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZm91bmQgaW4gdGhlIHJlZnJlc2ggaXRlbXMsIHRoZW4gaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRFZGl0YWJsZURhdGFDaGFuZ2VzZXQoKTtcclxuXHJcbiAgICAgICAgaWYgKGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBvc2VzIHRoZSBlbnVtIHR5cGUgdGhlbiBpbiB0ZW1wbGF0ZSB3ZSBjYW4gZGlyZWN0bHkgcmVmZXIgdG8gdGhlIGVudW0gdmFsdWUgbmFtZSBpbnN0ZWFkIG9mIGVudW0gdmFsdWUgbnVtYmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc29ydE1vZGVFbnVtOiBhbnkgPSBEYXRhVGFibGVTb3J0TW9kZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGV4cG9zZXMgdGhlIGVudW0gdHlwZSB0aGVuIGluIHRlbXBsYXRlIHdlIGNhbiBkaXJlY3RseSByZWZlciB0byB0aGUgZW51bSB2YWx1ZSBuYW1lIGluc3RlYWQgb2YgZW51bSB2YWx1ZSBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1UeXBlRW51bTogYW55ID0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZGF0YSBzb3VyY2UuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpOiBEYXRhVGFibGVEYXRhSXRlbSB8IERhdGFUYWJsZURhdGFJdGVtW10ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSA/IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubWFwKGl0ZW0gPT4gaXRlbS5jb250ZW50KSA6IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlID8gdGhpcy5pbnRlcm5hbFNlbGVjdGlvblswXS5jb250ZW50IDogdGhpcy5pbnRlcm5hbFNlbGVjdGlvblswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2VsZWN0aW9uKHNlbGVjdGlvbjogRGF0YVRhYmxlRGF0YUl0ZW0gfCBEYXRhVGFibGVEYXRhSXRlbVtdKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Db250ZW50ID0gc2VsZWN0aW9uLm1hcChzID0+IHMuY29udGVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbEl0ZW1zLmZpbHRlcihpdGVtID0+IHNlbGVjdGlvbkNvbnRlbnQuaW5kZXhPZihpdGVtLmNvbnRlbnQpICE9PSAtMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gc2VsZWN0aW9uIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5saW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLm1hcChzZWxlY3Rpb25JdGVtID0+IHNlbGVjdGlvbkl0ZW0uZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMuaW50ZXJuYWxJdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmNvbnRlbnQgPT09IHNlbGVjdGlvbilbMF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gYWN0dWFsU2VsZWN0aW9uID8gW2FjdHVhbFNlbGVjdGlvbl0gOiBbXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb24gPyBbc2VsZWN0aW9uXSA6IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0aW9uTW9kZSgpOiBzdHJpbmcgfCBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU2VsZWN0aW9uTW9kZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbk1vZGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGEgdGVtcCBjb2RlIHRvIHNvbHZlIHRoZSBwcm9ibGVtIHRoYXQ6XHJcbiAgICAgICAgLy8gd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSBhbmQgYW4gaW5pdGlhbCBhcnJheSB2YWx1ZSBpcyBhc3NpZ25lZCB0byB0aGUgc2VsZWN0aW9uIHByb3BlcnR5LFxyXG4gICAgICAgIC8vIGF0IHRoYXQgbW9tZW50IHRoZSBzZWxlY3Rpb25Nb2RlIHByb3BlcnR5IGlzIG5vdCBzZXQgdG8gbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGUgdmFsdWUsIHlldC5cclxuICAgICAgICAvLyBTbyB3ZSB0cmVhdCB0aGUgaW5pdGlhbCBhcnJheSB2YWx1ZSBhcyBhIG1lbWJlciBvZiB0aGUgc2VsZWN0aW9uIGFycmF5IGluc3RlYWQgb2YgdGhlIHNlbGVjdGlvbiBhcnJheS5cclxuICAgICAgICAvLyBTbyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBjb2RlIHRvIGZpeCB0aGlzIHByb2JsZW0uXHJcbiAgICAgICAgLy8gVE9ETzogbG9uZyB0ZXJtIHdpc2UsIHdlIG5lZWQgdG8gdXNlIHNlcGVyYXRlZCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBtYWludGFpbiB0aGUgc2VsZWN0aW9ucyBvZiBzZWxlY3Rpb25cclxuICAgICAgICAvLyBzZWxlY3Rpb24gYW5kIG11bHRpcGxlIHNlbGVjdGlvbi5cclxuICAgICAgICAvLyBUaGlzIGNoYW5nZSB3aWxsIGhhcHBlbiBpbiB0aGUgY29taW5nIHJlbGVhc2UuXHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5pbnRlcm5hbFNlbGVjdGlvbikgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0U29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdFNvcnRNb2RlOiBEYXRhVGFibGVTb3J0TW9kZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIGZpbHRlcmluZyBpcyBoYXBwZW5pbmcuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2ZpbHRlcicgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uRmlsdGVyKCk6IEV2ZW50RW1pdHRlcjxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXI7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGRvQ3VzdG9tU29ydDogRXZlbnRFbWl0dGVyPERhdGFUYWJsZUN1c3RvbVNvcnRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUN1c3RvbVNvcnRFdmVudD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIGEgcm93IGlzIHNlbGVjdGVkLlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdyb3dTZWxlY3RlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uUm93U2VsZWN0KCk6IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3RlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcm93U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIGEgcm93IGlzIHVuc2VsZWN0ZWQgYW5kIG5vIHJvdyBpcyBzZWxlY3RlZC5cclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAncm93VW5zZWxlY3RlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uUm93VW5zZWxlY3QoKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd1Vuc2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHJvd1Vuc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgb3Igc2V0cyB0aGUgZ3JvdXAgY29sdW1uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBncm91cENvbHVtbigpOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsR3JvdXBDb2x1bW47XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGdyb3VwQ29sdW1uKHZhbHVlOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbEdyb3VwQ29sdW1uICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsR3JvdXBDb2x1bW4gPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uc09yZGVyICYmIHRoaXMuY29sdW1uc09yZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIG9yIHNldHMgdGhlIGdyb3VwIHNvcnQgbW9kZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgZ3JvdXBTb3J0TW9kZSgpOiBEYXRhVGFibGVTb3J0TW9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxHcm91cFNvcnRNb2RlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBncm91cFNvcnRNb2RlKHZhbHVlOiBEYXRhVGFibGVTb3J0TW9kZSkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxHcm91cFNvcnRNb2RlID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ3JvdXAgdG9nZ2xlIHNob3VsZCBiZSB1c2VkIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgZ3JvdXAuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdXNlR3JvdXBUb2dnbGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IHRoZSBoZWFkZXIuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0hlYWRlciA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIFwiYXJpYS1sYWJlbGxlZGJ5XCIgdmFsdWUgZm9yIHRoZSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgdGFibGVBcmlhTGFiZWxsZWRCeSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsVGFibGVBcmlhTGFiZWxsZWRCeTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGFibGVBcmlhTGFiZWxsZWRCeSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlQXJpYUxhYmVsbGVkQnkgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFyaWFBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIFwiYXJpYS1sYWJlbFwiIHZhbHVlIGZvciB0aGUgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHRhYmxlQXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGFibGVBcmlhTGFiZWwodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJpYUF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyBzaG91bGQgdGhlIGRhdGEgdGFibGUgaGFzIHRoZSBncmlkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dHcmlkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgdGhlIFwiYWxsIGl0ZW1cIiBjaGVja2JveC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93QWxsSXRlbUNoZWNrYm94ID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGNoZWNrIHRoZSBpdGVtIGFuZCB1bmNoZWNrIG90aGVyIGl0ZW1zIHdoZW4gdGhlIGN1cnJlbnQgaXRlbSBpcyBjaGVja2VkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdEFuZENoZWNrID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgcm93IGhlaWdodCBmb3IgZWFjaCBpdGVtLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJvd0hlaWdodCA9IDMwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gbGluayB0aGUgc2VsZWN0aW9ucyBvZiBwYXJlbnQgbm9kZXMgYW5kIGNoaWxkIG5vZGVzLlxyXG4gICAgICogSXQgb25seSBhcHBseSB0byB0cmVlIHRhYmxlIHNjZW5hcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2VsZWN0IHRoZSBpdGVtIHdoZW4gbmF2aWdhdGluZyB3aXRoIHRoZSBrZXlib2FyZCAoZS5nLiBhcnJvdyBrZXlzLCBob21lLCBlbmQsIHBhZ2UgdXAsIHBhZ2UgZG93bilcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWxlY3RJdGVtV2hlbk5hdmlnYXRpbmdXaXRoS2V5Ym9hcmQgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgaXMgc2Nyb2xsYWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzY3JvbGxhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlJ3MgVUkgdmlydHVhbGl6YXRpb24gc2hvdWxkIGJlIGRpc2FibGVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRpc2FibGVVSVZpcnR1YWxpemF0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBpdGVtcyBhcmUgc2VsZWN0YWJsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGFibGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVkaXRhYmxlIGRhdGEgdGFibGUgYWxsb3cgYXV0b21hdGljYWxseSBhZGRpbmcgbmV3IHJvd3NcclxuICAgICAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSB0aGVuIGhhdmUgdG8gY3JlYXRlIG5ldyBsaW5lIG91dHNpZGUgb2YgdGhlIGRhdGF0YWJsZSBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZWRpdGFibGVBdXRvTmV3Um93ID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGVmYXVsdCBzdGF0dXMgb2YgdGhlIGdyb3VwIHRvZ2dsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0R3JvdXBUb2dnbGVFeHBhbmRlZCA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhdXRvUm93SGVpZ2h0ID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjb2x1bW5zT3JkZXI6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgZ3JvdXBUb2dnbGVTdGF0dXM6IHsgW2dyb3VwOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgIHB1YmxpYyBub2RlTmF2aWdhdGluZ1Rhc2s6IE5vZGVOYXZpZ2F0aW5nVGFzaztcclxuICAgIHB1YmxpYyBpc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xyXG5cclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmU7XHJcblxyXG4gICAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcblxyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gICAgICAgIHRoaXMubmdab25lID0gaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBpbmplY3Rvci5nZXQoU01FX0xBWU9VVF9QUk9WSURFUiwgbnVsbCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RWRpdGFibGVEYXRhQ2hhbmdlU2V0KCk6IEVkaXRhYmxlRGF0YUNoYW5nZVNldCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldCA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZnJlc2hEYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc2V0U2Nyb2xsKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFNldCB0aGUgc2Nyb2xsVG9wKGRpc3RhbmNlIGZyb20gdGhlIGVsZW1lbnQncyB0b3AgdG8gaXRzIHRvcG1vc3QgdmlzaWJsZSBjb250ZW50KVxyXG4gICAgICAgIC8vIG9mIFNjcm9sbCBjb250YWluZXIgdG8gMC5cclxuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG5cclxuICAgICAgICAvLyBObyBuZWVkIHRvIHJlc2V0ICd0aGlzLmN1cnJlbnRTdGFydEluZGV4T2ZJdGVtSW5WaWV3UG9ydCcgdG8gMCwgYXMgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGdldFxyXG4gICAgICAgIC8vIGFkanVzdGVkIHRvIDAgaW4gJ2NhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KCknLlxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbiA9IGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuaWQ7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndHJlZWdyaWQnKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2dyaWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RhYmxlJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5sYXlvdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5EYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlciA9IG5ldyBEYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlcih0aGlzLmxheW91dCk7XHJcbiAgICAgICAgICAgIC8vIG9uIHBhcmVudCBsYXlvdXQgY2hhbmdlcywgcmUtZW1pdCB0aGUgbGF5b3V0IGNoYW5nZSB0byBvdXIgZXZlbnRcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXQubGF5b3V0Q2hhbmdlZC5zdWJzY3JpYmUoKCgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2VkKCkpKSk7XHJcbiAgICAgICAgICAgIC8vIG9uIHdpbmRvdyBicmVhayBwb2ludCBjaGFuZ2VzLCBlbWl0IHRoZSBldmVudCBhYm91dCBjcml0aWNhbCBjbGFzc2VzIGFuZCBzdHlsaW5nIHVwZGF0ZXMgc2lnbmFsLlxyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dC53aW5kb3dCcmVha3BvaW50Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbldpbmRvd0JyZWFrcG9pbnRDaGFuZ2VkKCkpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGVmZXJyZWRPbkxheW91dENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBBcyB0aGUgdXNlciBzY3JvbGxzIG9uIHRoZSB4IGF4aXMgb2YgdGhlIGJvZHkgb2YgdGhlIHRhYmxlLCB3ZVxyXG4gICAgICAgICAgICAgKiBuZWVkIHRvIG1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1uIGhlYWRlcnMgb2YgdGhlIHRhYmxlIGludG9cclxuICAgICAgICAgICAgICogdmlldy5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWFyZ2luLWxlZnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHstdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdH1weGApO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kZWZhdWx0U29ydENvbHVtbiAmJiB0aGlzLmRlZmF1bHRTb3J0TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRDb2x1bW4gPSB0aGlzLmRlZmF1bHRTb3J0Q29sdW1uO1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRDb2x1bW4uc29ydE1vZGUgPSB0aGlzLmRlZmF1bHRTb3J0TW9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hY2Nlc3NpYmlsaXR5TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aGlzLnVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzc2liaWxpdHlNYW5hZ2VyLnJlZ2lzdGVyRWxlbWVudEZvY3VzaW5nRXZlbnQodGhpcy5vbkVsZW1lbnRGb2N1c2luZy5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQXJpYUF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogbG9vayBpbnRvIGltcHJvdmVtZW50cywgYWRkaW5nIHNldFRpbWVvdXQgaGVyZSBtYWtlcyB0aGUgY29tcG9uZW50IGxpZmUgY3ljbGUgaGFyZCB0byBtYW5hZ2VcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBEb20uZ2V0TmV4dEZvY3VzYWJsZUVsZW1lbnRJblRyYXAodGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgdGhpcy5zaG91bGRVc2VMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCA9ICFuZXh0RWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1ucygpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgY2FsY3VsYXRlcyB0aGUgYWN0dWFsIHNlbGVjdGVkIHJvdyBmcm9tIHRoZSBkYXRhIHRhYmxlIGRhdGEgYW5kIGFwcGx5IHByb3BlciBjc3MgY2xhc3MgdG8gaXQgdmlzdWFsbHkuXHJcbiAgICAgKiBAcGFyYW0gcmVuZGVyZWRJdGVtIHRoZSByZW5kZXJlZCBpdGVtIGZvciB0aGUgZGF0YSB0YWJsZS5cclxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHJvdyBzaG91bGQgYmUgZGlzcGxheWVkIGFzIHNlbGVjdGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3dEaXNwbGF5QXNTZWxlY3RlZChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiByZW5kZXJlZEl0ZW0uaW5kZXggPT09IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5TaW5nbGUgJiZcclxuICAgICAgICAgICAgKCF0aGlzLnNob3dBc1RyZWUgfHwgdGhpcy5zaG93QXNUcmVlICYmICF0aGlzLnNlbGVjdGVkVHJlZU5vZGVQYXJlbnRDb2xsYXBzZWQpIHx8IHRoaXMuaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25IZWFkZXJUYWJsZVByZXNzZWQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBsZXQgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkRvd25BcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9OZXh0UmVuZGVyZWRJdGVtKHRydWUsIC0xKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuTGVmdEFycm93OlxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuVXBBcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9IZWFkT2ZSZW5kZXJlZEl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBEb20uZ2V0UHJldmlvdXNab25lRWxlbWVudChjdXJyZW50RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5SaWdodEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb0hlYWRPZlJlbmRlcmVkSXRlbXMoKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Wm9uZUVsZW1lbnQoY3VycmVudEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24pIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRUYWJsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5vbkNvbnRlbnRUYWJsZUtleVVwKGV2ZW50LCB0aGlzLmNvbnRlbnRFbGVtZW50LCB0aGlzLmVkaXRhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFyYml0cmFyeVNjcm9sbChzY3JvbGxUb3A6IG51bWJlciwgaXNJbmNyZW1lbnQ/OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKGlzSW5jcmVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWlzSW5jcmVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGlmIChkaWZmID4gc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgKz0gc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPD0gc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC0gc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBpZiAoZGlmZiA+IHNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC09IHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDw9IHNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudFRhYmxlUHJlc3NlZChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9PSBLZXlDb2RlLkN0cmwgJiYgZXZlbnQua2V5Q29kZSAhPT0gS2V5Q29kZS5TaGlmdCkge1xyXG4gICAgICAgICAgICBDb3JlRW52aXJvbm1lbnQuYWNjZXNzaWJpbGl0eU1hbmFnZXIuY2hhbmdlQWNjZXNzaWJpbGl0eU1vZGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICBjb25zdCBjdXJyZW50Um93ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IodGFyZ2V0RWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAvLyBjdHJsS2V5IGZvciBzaW5nbGUgc2VsZWN0aW9uIG1vZGUgd29ya3MgZmluZVxyXG4gICAgICAgIC8vIGN0cmxLZXkgZm9yIG11bHRpcGxlIHNlbGVjdGlvbiB3aWxsIGJlIHJlZ2FyZGVkIGFzIHNlbGVjdCBhbGwgcm93cyB0aGF0XHJcbiAgICAgICAgLy8gd2lsbCBiZSBoYW5kbGVkIG5vdCBoZXJlLlxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlICYmICFldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJldHVybiA9IHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXJcclxuICAgICAgICAgICAgICAgIC5lZGl0YWJsZURhdGFUYWJsZU9uQ29udGVudFRhYmxlUHJlc3NlZEhhbmRsZXIoZXZlbnQsIHRhcmdldEVsZW1lbnQsIGN1cnJlbnRSb3csIHRoaXMubGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAoc2hvdWxkUmV0dXJuKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkN0cmwgfHwgZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5TaGlmdCkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKV07XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgLy8gRm9yIG5vdyBhc3N1bWluZyB0cmVlIHRhYmxlIGZpcnN0IGZvY3VzIG9uIHJvdyBhbmQgdGhlblxyXG4gICAgICAgIC8vIHRoZSB1c2VyIGhhcyB0byBoaXQgZW50ZXIvc3BhY2UgdG8gc2VsZWN0IHRoaXMgZm9jdXNlZCBpdGVtXHJcbiAgICAgICAgLy8gRm9yIG90aGVyIHR5cGUgb2YgdGFibGUgd2lsbCBmaXJzdCBzZWxlY3QgYW5kIHRoZW4gYXV0b21hdGljYWxseSBmb2N1cyBieSBkZWZhdWx0XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0QW5kRm9jdXMgPSAhdGhpcy5zaG93QXNUcmVlO1xyXG5cclxuICAgICAgICAvLyBPbmx5IHRoZSBzY3JvbGxpbmcgcmVsYXRlZCBuYXZpZ2F0aW9uIGtleWJvYXJkIG9wZXJhdGlvbnMgbmVlZCBkZWJvdW5jaW5nLlxyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuQTpcclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHNlbGVjdCBhbGwgaGFuZGxlclxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYWxzbyBoYW5kbGUgd2hlbiBlZGl0YWJsZSBkYXRhdGFibGUgYW5kIHRoZSBmb2N1cyBpcyBpbiBzbWUtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSAmJiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzU21lRm9ybUZpZWxkKHRhcmdldEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuc2hpZnRLZXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5Ib21lOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvSGVhZE9mUmVuZGVyZWRJdGVtcyhzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5VcEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzY3JvbGwgdXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmJpdHJhcnlTY3JvbGwodGhpcy5kZWZhdWx0U2Nyb2xsUGl4ZWxzLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA+IDAgfHwgdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUHJldmlvdXNSZW5kZXJlZEl0ZW0oc2VsZWN0QW5kRm9jdXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0UHJldmlvdXNab25lRWxlbWVudChjdXJyZW50RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5Eb3duQXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbCBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJiaXRyYXJ5U2Nyb2xsKHRoaXMuZGVmYXVsdFNjcm9sbFBpeGVscywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdpdGggc2hpZnRLZXkgbWVhbnMgbmVlZHMgc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvTmV4dFJlbmRlcmVkSXRlbShldmVudC5zaGlmdEtleSA/IHRydWUgOiBzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlBhZ2VVcDpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb1ByZXZpb3VzUGFnZU9mUmVuZGVyZWRJdGVtcyhzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5QYWdlRG93bjpcclxuICAgICAgICAgICAgICAgIGlmICgoPEhUTUxFbGVtZW50PmV2ZW50LnNyY0VsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9OZXh0UGFnZU9mUmVuZGVyZWRJdGVtcyhzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVuZDpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb0VuZE9mUmVuZGVyZWRJdGVtcyhzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5TcGFjZTpcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVudGVyOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkRW50ZXJTcGFjZShjdXJyZW50UmVuZGVyZWRJdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFuZEZvY3VzLCBldmVudCwgdGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkxlZnRBcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRMZWZ0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbSwgdGFyZ2V0RWxlbWVudCwgY3VycmVudFJvdyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlJpZ2h0QXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkUmlnaHRBcnJvdyhjdXJyZW50UmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50LCBjdXJyZW50Um93KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRm9yIHRoZSB0cmVlIHRhYmxlIG5vdyB3ZSBmaXJzdCBmb2N1cyBhbmQgdGhlbiB1c2UgdGhlIHJpZ2h0IGFycm93IGtleSBvciBlbnRlciBvciBzcGFjZSB0byBzZWxlY3RcclxuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGxvZ2ljIGJlZm9yZSBoZXJlIG9ubHkgZGlkIGFuIGFycm93IHVwL2Rvd24ga2V5LCB3ZSBuZWVkIHRoZSBzZWxlY3Rpb24gaGFwcGVuaW5nIGFzIHdlbGxcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhdKTtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlVwQXJyb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgtLTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5Eb3duQXJyb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbikge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25EZWJvdW5jZVRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKSB7XHJcbiAgICAgICAgLy8gSWYgdHJlZSB0YWJsZSBhbmQgdGhlIGN1cnJlbnQgZm9jdXNlZCBlbGVtZW50IGluZGV4IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzZWxlY3RlZCBvbmVcclxuICAgICAgICAvLyBXaWxsIHNlbGVjdCB0aGUgcm93IGJhc2VkIG9uIGZvY3VzZWQgZWxlbWVudFxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggIT09IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleCh0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBrZXlib2FyZCBwcmVzcyBldmVudCBmb3IgZW50ZXIgYW5kIHNwYWNlXHJcbiAgICAgKiBUbyB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24sIGVpdGhlciBmb2N1cyBvbiB0YWJsZSByb3cgb3IgdGFibGUgcm93IGNlbGwgdGVtcGxhdGUgYW5kXHJcbiAgICAgKiBjbGljayB0aGUgJ2VudGVyJyBvciAnc3BhY2UnIGJ1dHRvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkNvbnRlbnRUYWJsZVByZXNzZWRFbnRlclNwYWNlKGN1cnJlbnRSZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgc2VsZWN0QW5kRm9jdXM6IGJvb2xlYW4sXHJcbiAgICAgICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgLy8gaWYgZmFsc2UsIGZvY3VzZWQgb24gdGFibGUgcm93IGNlbGwgdGVtcGxhdGVcclxuICAgICAgICAvLyBpZiB0cnVlLCBmb2N1c2VkIG9uIHRhYmxlIHJvdyBpdGVtIGNvbXBvbmVudFxyXG4gICAgICAgIGxldCBmb2N1c2VkT25Sb3dDb21wb25lbnQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCAmJiB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdCAmJiB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKSB7XHJcbiAgICAgICAgICAgIGZvY3VzZWRPblJvd0NvbXBvbmVudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlNwYWNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBzcGFjZSBvbiBhIGRhdGEgdGFibGUgaXMgdG8gbW92ZSB0byB0aGUgbmV4dCBwYWdlXHJcbiAgICAgICAgICAgICAgICAvLyBPdXIgZGF0YSB0YWJsZSBiZWhhdmVzIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2luZG93cyAxMCBmaWxlIGV4cGxvcmVyXHJcbiAgICAgICAgICAgICAgICAvLyBPbiBzcGFjZS9lbnRlciB3aWxsIGJvdGggc2VsZWN0IHRoZSBjdXJyZW50IHJvdy5cclxuICAgICAgICAgICAgICAgIC8vIFNvIGFsd2F5cyBkZWNsaW5lIGRlZmF1bHQgZnVuY3Rpb24gZm9yIHNwYWNlIGtleWJvYXJkIGV2ZW50IGFzIGxvbmcgYXMgZm9jdXMgaXMgb24gdGhlIHJvdyBiZWNhdXNlXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgbmVlZCB0aGUgbW92ZSB0byB0aGUgbmV4dCBwYWdlIGJlaGF2aW9yXHJcbiAgICAgICAgICAgICAgICBpZiAoZm9jdXNlZE9uUm93Q29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gSWYgS2V5Q29kZSBpcyBFbnRlciwganVzdCByZW1haW4gdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvblxyXG4gICAgICAgICAgICAvLyBObyBuZWVkIHRvIGRpc2FibGUgdGhlIGVudGVyIGtleSBkZWZhdWx0IGZ1bmN0aW9uXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpO1xyXG4gICAgICAgICAgICBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkl0ZW1DaGVja0JveENsaWNrZWQoY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBzZWxlY3QgYSByb3cuIG5vdCBleHBhbmQvY29sbGFwc2UgaXRcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRFbnRlcktleUZvckRlZmF1bHRBY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb3VibGVDbGlja1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IExvZ0xldmVsLkRlYnVnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTm8gZXZlbnQgaGFuZGxlciBiaW5kIHRvIFwiZG91YmxlQ2xpY2tSb3dcIiBldmVudC4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdEYXRhVGFibGVDb21wb25lbnQub25Db250ZW50VGFibGVQcmVzc2VkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0QW5kRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG91YmxlQ2xpY2tSb3cobnVsbCwgY3VycmVudFJlbmRlcmVkSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdyh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUgJiYgZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5FbnRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZFJpZ2h0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgY3VycmVudFJvdzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrR3JvdXBUb2dnbGUoY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSXRlbSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVHJlZVRhYmxlUGFyZW50Tm9kZShjdXJyZW50UmVuZGVyZWRJdGVtKSkge1xyXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUobnVsbCwgY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRSZW5kZXJlZEl0ZW0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgbGV0IHJvd0Zvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IobmV4dEVsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgICAgIGxldCBjZWxsRm9yTmV4dEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihuZXh0RWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNlbGxGb3JOZXh0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBjZWxsRm9yTmV4dEVsZW1lbnQgJiYgaSA8IGNlbGxGb3JOZXh0RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxGb3JOZXh0RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldID09PSBjZWxsRm9yTmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmVtYWluIGZvY3VzIG9uIHRoZSBmaXJzdCBjaGVja2JveCB3aGVuIGl0IGlzIGVkaXRhYmxlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmICF0aGlzLmVkaXRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRGF0YVRhYmxlQ2hlY2tCb3hIVE1MRWxlbWVudChuZXh0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0RWxlbWVudCBpcyB0aGUgY2hlY2tib3ggaW4gZmlyc3QgY29sdW1uLCBtb3ZlIG9uIHRoZSBuZXh0IGNhbmRpZGF0ZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KG5leHRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0Zvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxGb3JOZXh0RWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS10ZCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCAhPT0gLTFcclxuICAgICAgICAgICAgICAgICYmIGN1cnJlbnRSb3cgPT09IHJvd0Zvck5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkTGVmdEFycm93KGN1cnJlbnRSZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsIGN1cnJlbnRSb3c6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrR3JvdXBUb2dnbGUoY3VycmVudFJlbmRlcmVkSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVHJlZVRhYmxlUGFyZW50Tm9kZShjdXJyZW50UmVuZGVyZWRJdGVtKSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgY3VycmVudFJlbmRlcmVkSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4XS5ub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUgPT09IHBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFByZXZpb3VzRm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3Qgcm93Rm9yUHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG4gICAgICAgICAgICBpZiAoY2VsbEZvclByZXZpb3VzRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBjZWxsRm9yUHJldmlvdXNFbGVtZW50ICYmIGkgPCBjZWxsRm9yUHJldmlvdXNFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEZvclByZXZpb3VzRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldID09PSBjZWxsRm9yUHJldmlvdXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmIHByZXZpb3VzRWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmV2aW91c0VsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1jaGVja2JveCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXNFbGVtZW50IGlzIHRoZSBjaGVja2JveCBpcyBpbiB0aGUgZmlyc3QgY29sdW1uLCB0aGVuIHNraXAgaXQsIGRpcmVjdGx5IGdvIHRvIHRoZSByb3cuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSByb3dGb3JQcmV2aW91c0VsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQgPT09IGN1cnJlbnRSb3cgfHwgcm93Rm9yUHJldmlvdXNFbGVtZW50ICE9PSBjdXJyZW50Um93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3dGb3JQcmV2aW91c0VsZW1lbnQgPT09IGN1cnJlbnRSb3cpIHtcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1RyZWVUYWJsZVBhcmVudE5vZGUodHJlZU5vZGVJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJlZU5vZGVJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUgJiYgIXRyZWVOb2RlSXRlbS5ub2RlLmlzTGVhZjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50SXRlbUZvY3VzZWQoZXZlbnQ6IEZvY3VzRXZlbnQsIHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIDxIVE1MRWxlbWVudD5kb2N1bWVudC5hY3RpdmVFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtdGQnKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyRWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKHRkRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgaWYgKHRyRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGRFbGVtZW50cyA9IHRyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXRkJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRkRWxlbWVudHNbaV0gPT09IHRkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmZvY3VzSW5UYWJsZUNlbGwoZXZlbnQpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudEl0ZW1CbHVycmVkKGV2ZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGVudEFyZWFIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5mb2N1c091dFRhYmxlQ2VsbChldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW5kZXJlZEl0ZW1Sb3dGb2N1c091dChyZW5kZXJlZEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUVkaXRhYmxlRGF0YVJvdyhkYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQgZGF0YUV4aXN0c0luSW50ZXJuYWxJdGVtcyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnRlcm5hbEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT50aGlzLmludGVybmFsSXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmNvbnRlbnQgPT09IGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFFeGlzdHNJbkludGVybmFsSXRlbXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kSW5BZGRlZEl0ZW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtc1tqXSA9PT0gaXRlbS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMuc3BsaWNlKGosIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluQWRkZWRJdGVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtc1tqXSA9PT0gaXRlbS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSW5BZGRlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuZGVsZXRlZEl0ZW1zLnB1c2goaXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxJdGVtcy5zcGxpY2UoaSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSb3cgbm90IHlldCBhZGRlZCB0byBpbnRlcm5hbEl0ZW1zLCBqdXN0IHJlZnJlc2hcclxuICAgICAgICBpZiAoIWRhdGFFeGlzdHNJbkludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c2VkKGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzT25jZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXRlTkdDbGFzc0ZvclJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpLFxyXG4gICAgICAgICAgICAnc21lLXRhYmxlLWdyb3VwLWl0ZW0nOiByZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEl0ZW0sXHJcbiAgICAgICAgICAgICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyJzogcmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIsXHJcbiAgICAgICAgICAgICdzbWUtY2hlY2tlZCc6IHRoaXMuaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuc2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoID09PSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZU5vZGVEYXRhSXRlbSA9IDxUcmVlTm9kZURhdGFJdGVtPnRoaXMuZmlsdGVyZWRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRyZWVOb2RlRGF0YUl0ZW0gfHwgIXRyZWVOb2RlRGF0YUl0ZW0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4ID0gcmVuZGVyZWRJdGVtLmluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPT09IHJlbmRlcmVkSXRlbS5pbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldElzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgaXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLXNtZS1sYXN0LWZvY3VzYWJsZS1zaGFkb3ctZWxlbWVudCcpKSB7XHJcbiAgICAgICAgICAgIGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVJlbmRlcmVkSXRlbVJvd0ZvY3VzT3V0KHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWRpdGFibGVEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgICAgICBpZiAoZWRpdGFibGVEYXRhSXRlbS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNob3VsZEFkZE5ld1JvdyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBoYW5kbGUgaWYgYW55IGZvcm0gZmllbGQgaXMgZGlydHkgdGhlbiB2YWxpZGF0ZVxyXG4gICAgICAgICAgICAgICAgbGV0IGF0TGVhc3RPbmVGaWVsZERpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50cy5mb3JFYWNoKGxvYWRlciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkQ29udGFpbmVyID0gPEZvcm1GaWVsZENvbnRhaW5lcj5sb2FkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlci5yZW5kZXJlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVyRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5sb2FkZXIucmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXJEYXRhSXRlbS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1GaWVsZENvbnRhaW5lci5pc0RpcnR5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdExlYXN0T25lRmllbGREaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgYWxzbyBoYW5kbGUgd2hlbiBmb2N1c2luZyBvdXQgZnJvbSB0aGUgbGFzdCBmb3JtIGZpZWxkIGluIHRoZSByb3dcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCA9IHRoaXMuZ2V0SXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGF0TGVhc3RPbmVGaWVsZERpcnR5IHx8IGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZE5ld1JvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHMuZm9yRWFjaChsb2FkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRDb250YWluZXIgPSA8Rm9ybUZpZWxkQ29udGFpbmVyPmxvYWRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlci5yZW5kZXJlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlckRhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+bG9hZGVyLnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlckRhdGFJdGVtLmlzTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtRmllbGRDb250YWluZXIuY2hlY2tWYWxpZGF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkTmV3Um93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFkZE5ld1JvdyAmJiB0aGlzLmVkaXRhYmxlQXV0b05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdEYXRhSXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlTmV3RGF0YUhhbmRsZXIgPSBkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUl0ZW0gPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZVJvd0FkZGVkLmVtaXQoeyBkYXRhOiBuZXdEYXRhSXRlbSwgb3ZlcnJpZGVOZXdEYXRhSGFuZGxlcjogb3ZlcnJpZGVOZXdEYXRhSGFuZGxlciB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50ID0gbmV3RGF0YUl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRJdGVtLmRhdGEuaXNOZXdSb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMucHVzaChyZW5kZXJlZEl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5wdXNoKG5ld0RhdGFJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXNldFVwZGF0ZWQuZW1pdCh0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxJdGVtcy5wdXNoKG5ld0RhdGFJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZFNob3dFZGl0Um93KHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBbGxFZGl0YWJsZVJvd3NWaXNpYmxlKSB7IHJldHVybiB0cnVlOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICByZXR1cm4gcmVuZGVyZWRJdGVtLmluZGV4ID09PSB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KClcclxuICAgICAgICAgICAgfHwgdGhpcy5oYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtKVxyXG4gICAgICAgICAgICB8fCByZW5kZXJlZEl0ZW0uaW5kZXggPT09IHRoaXMuaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4XHJcbiAgICAgICAgICAgIHx8IGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3c7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHRleHQgdGhhdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmlhLWxhYmVsIGZvciBjb2x1bW4gc29ydCBvcmRlciAoaWYgc29ydGFibGUpLlxyXG4gICAgICogVGhpcyBsYWJlbCBpcyB1dGlsaXplZCBieSBzY3JlZW4gcmVhZGVycyBmb3IgYWNjZXNzaWJpbGl0eS5cclxuICAgICAqIElmIHRoZSBjdXJyZW50IHNvcnQgb3JkZXIgaXMgQXNjZW5kaW5nLCB0aGUgbGFiZWwgd2lsbCBpbmRpY2F0ZSBhIGJ1dHRvbiBpY29uIGlzIHByZXNlbnQgdG8gRGVzY2VuZCBvcmRlci5cclxuICAgICAqIElmIHRoZSBjdXJyZW50IHNvcnQgb3JkZXIgaXMgRGVzY2VuZGluZywgdGhlIGxhYmVsIHdpbGwgaW5kaWNhdGUgYSBidXR0b24gaWNvbiBpcyBwcmVzZW50IHRvIEFzY2VuZCBvcmRlci5cclxuICAgICAqIElmIHRoZSBjdXJyZW50IHNvcnQgb3JkZXIgaXMgTm9uZSwgdGhlIGxhYmVsIGlzIG51bGwsIGFuZCB0aGUgc2NyZWVuIHJlYWRlciB3aWxsIG5vdCByZWFkIGFueXRoaW5nLlxyXG4gICAgICogQHBhcmFtIGNvbHVtbiB0aGUgdGFibGUgY29sdW1uXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGFyaWEtbGFiZWwgb24gdGhlIHNvcnQgaWNvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U29ydExhYmVsKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHtcclxuICAgICAgICBzd2l0Y2ggKGNvbHVtbi5zb3J0TW9kZSkge1xyXG4gICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLkFyaWEuTGFiZWwuZGVzY2VuZFNvcnRPcmRlckJ1dHRvbjtcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5EZXNjZW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuQXJpYS5MYWJlbC5hc2NlbmRTb3J0T3JkZXJCdXR0b247XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlU29ydE1vZGUuTm9uZTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGltcGxlbWVudHMgdGhlIEFmdGVyVmlld0luaXQgaW50ZXJmYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlU2Nyb2xsYmFyV2lkdGgoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsSGFuZGxlciA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxlZERvd24gPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPiAwO1xyXG4gICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Njcm9sbGVkRG93bikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsYXp5IGxvYWRpbmcgaXMgZW5hYmxlZCwgcmVkdWNlIHRoZSBmcmVxZW5jeSBvZiBoYW5kbGluZyBzY3JvbGxpbmdcclxuICAgICAgICAgICAgICAgIC8vIGVzcGVjaWFsbHkgZG9pbmcgdGhlIGRhdGEgbGF6eSBsb2FkaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxDaGVja0ludGVydmFsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmdFdmVudEhhbmRsZXJTZXR1cCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtSW5WaWV3UG9ydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENoZWNrSW50ZXJ2YWxEdXJhdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKTtcclxuICAgICAgICB0aGlzLmV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVUkoKTtcclxuICAgICAgICB0aGlzLmNoZWNrSW1tZWRpYXRlVmFsaWRhdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIEBZaWVsZCgpXHJcbiAgICBwcml2YXRlIGNoZWNrSW1tZWRpYXRlVmFsaWRhdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50cy5mb3JFYWNoKGxvYWRlciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRDb250YWluZXIgPSA8Rm9ybUZpZWxkQ29udGFpbmVyPmxvYWRlcjtcclxuICAgICAgICAgICAgICAgIGlmIChsb2FkZXIucmVuZGVyZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkQ29udGFpbmVyLmltbWVkaWF0ZVZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW1wbGVtZW50cyB0aGUgT25EZXN0cm95IGludGVyZmFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbENoZWNrSW50ZXJ2YWwpO1xyXG4gICAgICAgIHRoaXMuZXZlbnRVbnJlZ2lzdHJhdGVySGFuZGxlcnMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy51bnJlZ2lzdGVyT25FbGVtZW50Rm9jdXNpbmdFdmVudEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy51bnJlZ2lzdGVyT25FbGVtZW50Rm9jdXNpbmdFdmVudEhhbmRsZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q2hhbmdlU3Vic2NyaWJlcikge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dENoYW5nZVN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVyU3Vic2NyaWJlcikge1xyXG4gICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlclN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbXBsZW1lbnRzIHRoZSBBZnRlclZpZXdDaGVja2VkIGludGVyZmFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0NoZWNrZWQoKTtcclxuICAgICAgICB0aGlzLmFsaWduQ29udGVudCgpO1xyXG4gICAgICAgIHRoaXMuYWxpZ25TY3JvbGxCYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSB0YWJsZSBpdGVtLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VsZWN0SXRlbShldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsIGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBtdWx0aXBsZVNlbGVjdE1vZGUgPSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTm9ybWFsO1xyXG4gICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVTZWxlY3RNb2RlID0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlBpY2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZVNlbGVjdE1vZGUgPSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuU2VxdWVudGlhbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlICYmICg8SFRNTEVsZW1lbnQ+ZXZlbnQuc3JjRWxlbWVudCkudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaXRlbSA/IGl0ZW0uaW5kZXggOiAtMSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldFsndHlwZSddID09PSAnY2hlY2tib3gnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBpdGVtLm5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZVNlbGVjdGVkLmVtaXQoeyBub2RlOiBpdGVtLm5vZGUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0QW5kQ2hlY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5Ob3JtYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goY3VycmVudEl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGN1cnJlbnRJdGVtLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oaXRlbS5ub2RlLCB0cnVlLCBmYWxzZSwgIXRoaXMubGlua1BhcmVudENoaWxkcmVuU2VsZWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuUGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oaXRlbS5ub2RlLCAhaXRlbS5ub2RlLnNlbGVjdGVkLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5TZXF1ZW50aWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NtZS11c2VyLXNlbGVjdC1ub25lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGVhclRleHRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCAhPT0gLTEgJiYgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZCA9IGl0ZW0uaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaW5kZXggPCB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZWQgYSBidWcgdGhhdCB0cmVlIHRhYmxlIG11bHRpcGxlIHNlbGVjdGlvbiB3aWxsIGxvc3QgZm9jdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0UGFyZW50OiBUcmVlTm9kZURhdGFJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlICE9PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UGFyZW50ID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBlbmQgKyAxOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmludGVybmFsU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdEFuZENoZWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuUGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuU2VxdWVudGlhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLXVzZXItc2VsZWN0LW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGVhclRleHRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggIT09IC0xICYmIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaW5kZXggPCB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGl0ZW0uaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtpdGVtLmRhdGFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5lZGl0YWJsZSA/IGl0ZW0uZGF0YS5jb250ZW50IDogaXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiB0aGlzLmVkaXRhYmxlID8gaXRlbS5kYXRhLmNvbnRlbnQgOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQgJiYgIURvbS5pc0ZvY3VzYWJsZSg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGZ1bmN0aW9uIHRvIGZvY3VzIG9uIGVtcHR5IG1lc3NhZ2Ugd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBlbXB0eVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZW1wdHlNZXNzYWdlRWxlbWVudCAmJiB0aGlzLmVtcHR5TWVzc2FnZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpdGVtLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbEJvZHlFbGVtZW50ICYmIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudCAmJiB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0VHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZlcnJlZFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHByaXZhdGUgZGVmZXJyZWRUcnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCkge1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50LS07XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCgpIHtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCA9IDM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBubyByZWNvcmRzIG1lc3NhZ2Ugd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBlbXB0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE5vUmVjb3Jkc01lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub1JlY29yZE1lc3NhZ2UgfHwgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5Ob1JlY29yZHNGb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGRldGVybWluZXMgd2hldGhlciB0bywgb3Igbm90IHRvIHNob3cgdGhlIE5vLVJlY29yZHMgTWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3dOb1JlY29yZHNNZXNzYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5sYXp5TG9hZCkgfHwgIXRoaXMuaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgfHxcclxuICAgICAgICAgICAgKHRoaXMubGF6eUxvYWQgJiYgdGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBiZWhhdmlvciB0aGF0IHdoZW4gYSBncm91cCB0b2dnbGUgaXMgY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrR3JvdXBUb2dnbGUoaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpdGVtLmluZGV4KTtcclxuICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV0gPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgIHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICF0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV07XHJcbiAgICAgICAgdGhpcy5ncm91cFRvZ2dsZUNsaWNrLmVtaXQoaXRlbS5kYXRhKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgYmVoYXZpb3IgdGhhdCB3aGVuIGEgdHJlZSBub2RlIHRvZ2dsZSBpcyBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tUcmVlVG9nZ2xlKGV2ZW50OiBFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGlzVHJlZU5vZGVDb2xsYXBzaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaXRlbS5ub2RlLmV4cGFuZGVkID0gdG9nZ2xlU3RhdHVzT3ZlcnJpZGRlblZhbHVlICE9PSB1bmRlZmluZWQgPyB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgOiAhaXRlbS5ub2RlLmV4cGFuZGVkO1xyXG4gICAgICAgIGlmIChpdGVtLm5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlRXhwYW5kZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVDb2xsYXBzZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICAgICAgaXNUcmVlTm9kZUNvbGxhcHNpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmdldFRyZWVOb2RlRGF0YUlkZW50aXR5KGl0ZW0ubm9kZSk7XHJcbiAgICAgICAgdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XSA9IGl0ZW0ubm9kZS5leHBhbmRlZDtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3RlZCBub2RlJ3MgcGFyZW50IGlzIGNvbGxhcHNpbmcsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhY3RpdmUgcmVuZGVyZWQgaXRlbSBpbmRleC5cclxuICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUcmVlTm9kZVBhcmVudENvbGxhcHNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleEJ5U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVHJlZU5vZGVDb2xsYXBzaW5nKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy50cmVlVGFibGVDb2xsYXBzZUhhbmRsZXIoaXRlbS5ub2RlLCB0aGlzLnNlbGVjdGlvbikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRyZWVOb2RlUGFyZW50Q29sbGFwc2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBhbmRzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhwYW5kQWxsR3JvdXAoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBpbiB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzLmhhc093blByb3BlcnR5KGdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgY29sbGFwc2VzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGFwc2VBbGxHcm91cCgpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXMuaGFzT3duUHJvcGVydHkoZ3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmV0dXJucyB0aGUgYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBnaXZlbiBjb2x1bW4gaXMgdGhlIGZpcnN0IGRhdGEgY29sdW1uLlxyXG4gICAgICogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGFkZCBzb21lIGN1c3RvbSBjc3MgZm9yIHRoZSBmaXJzdCBkYXRhIGNvbHVtbiB3aGVuIGdyb3VwaW5nIGlzIGVuYWJsZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBmaXJzdERhdGFDb2x1bW4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGN1cnJlbnRDb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudENvbHVtbiAhPT0gdGhpcy5ncm91cENvbHVtbiAmJiAhZmlyc3REYXRhQ29sdW1uICYmICFjdXJyZW50Q29sdW1uLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgZmlyc3REYXRhQ29sdW1uID0gY3VycmVudENvbHVtbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sdW1uID09PSBmaXJzdERhdGFDb2x1bW47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gaWQgaWYgdGhlIGNvbHVtbiBpcyB0aGUgZmlyc3QgYW5kIHJlbmRlcmVkIGl0ZW0gaGFzIGEgdmFsaWQgaW5kZXgsIG90aGVyd2lzZSByZXR1cm4gbnVsbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCwgcmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNGaXJzdERhdGFDb2x1bW4oY29sdW1uKSB8fFxyXG4gICAgICAgICAgICAhKHJlbmRlcmVkSXRlbSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHJlbmRlcmVkSXRlbS5pbmRleCkgJiYgcmVuZGVyZWRJdGVtLmluZGV4ID49IDApKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaWRCYWcuZmlyc3REYXRhQ29sdW1uICsgcmVuZGVyZWRJdGVtLmluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6aW5nKGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xyXG4gICAgICAgIHRoaXMucmVzaXplckluZGljYXRvci5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3NtZS1sYXlvdXQtbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVzaXplckluZGljYXRvci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBldmVudC54ICsgJ3B4JztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db2x1bW5SZXNpemVkKGNvbHVtbkluZGV4OiBudW1iZXIsIGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLWxheW91dC1ub25lJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbHVtbkhlYWRlckVsZW1lbnRzID0gdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLWNvbHVtbi1oZWFkZXInKTtcclxuICAgICAgICBjb25zdCBuZXdDb2x1bW5XaWR0aHM6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgbGV0IHRvdGFsV2lkdGggPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uSGVhZGVyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbmV3Q29sdW1uV2lkdGhzLnB1c2goY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGgpO1xyXG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2ldLm9mZnNldFdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVGhlIHJlc2l6ZXIgaXMgYXQgdGhlIHJpZ2h0IGJvcmRlciBvZiB0aGUgY3VycmVudCBjb2x1bW4uXHJcbiAgICAgICAgLy8gV2hlbiB0aGUgcmVzaXppbmcgaGFwcGVucywgaXQgbWVhbnMgcmVzaXppbmcgdGhlIGN1cnJlbnQgY29sdW1uIHdpdGggZGVsdGEgYW1vdW50XHJcbiAgICAgICAgLy8gYW5kIHJlc2l6aW5nIHRoZSBuZXh0IGNvbHVtbiB3aXRoIC1kZWx0YSBhbW91bnQuXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQgPSBjb2x1bW5IZWFkZXJFbGVtZW50c1tjb2x1bW5JbmRleF07XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiA9IGN1cnJlbnRDb2x1bW5IZWFkZXJFbGVtZW50Lm9mZnNldFdpZHRoICsgZXZlbnQueDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIG5leHRDb2x1bW5IZWFkZXIgaXMgaGlkZGVuLCB0aGF0IG1lYW5zIGl0J3MgYSBncm91cCBjb2x1bW4gaGVhZGVyIHdoaWNoIHNob3VsZCBiZSBoaWRkZW4uXHJcbiAgICAgICAgLy8gQSBoaWRkZW4gZ3JvdXAgaGVhZGVyJ3Mgd2lkdGggc2hvdWxkIG5vdCBiZSBjb3VudGVkLlxyXG4gICAgICAgIC8vIFRoZW4gc2V0IHRoZSBuZXh0Q29sdW1uSW5kZXggdG8gdGhlIG5leHQgbmV4dCBjb2x1bW4ncyBpbmRleC5cclxuICAgICAgICBjb25zdCBuZXh0Q29sdW1uSW5kZXggPSBjb2x1bW5JbmRleCArIChjb2x1bW5IZWFkZXJFbGVtZW50c1tjb2x1bW5JbmRleCArIDFdLmhhc0F0dHJpYnV0ZSgnaGlkZGVuJykgPyAyIDogMSk7XHJcbiAgICAgICAgY29uc3QgbmV4dENvbHVtbkhlYWRlckVsZW1lbnQgPSBjb2x1bW5IZWFkZXJFbGVtZW50c1tuZXh0Q29sdW1uSW5kZXhdO1xyXG4gICAgICAgIGxldCBuZXdXaWR0aEZvck5leHRDb2x1bW4gPSBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudC5vZmZzZXRXaWR0aCAtIGV2ZW50Lng7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW4gaXMgbGVzcyB0aGVuIG1pbkNvbHVtbldpZHRoLCBpdCBtZWFucyB0aGUgdXNlciBpcyB0cnlpbmcgdG8gZHJhZyB0aGUgcmVzaXplciB0byB2ZXJ5IGxlZnRcclxuICAgICAgICAvLyB0byBtYWtlIHRoZSBuZXh0IGNvbHVtbiB2ZXJ5IHdpZGUuXHJcbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRyeSB0byBtYWtlIHN1cmUgdGhlIG5leHQgY29sdW1uIGNhbiBiZSByZXNpemVkIHRvIGFzIHdpZGUgYXMgdGhlIHVzZXIgd2FudHMuXHJcbiAgICAgICAgLy8gVGhlIGxlZnQgc2lkZSBjb2x1bW5zIG9mIHRoZSBuZXh0IGNvbHVtbiB3aWxsIGJlIHNocnVuayBiYXNlZCBvbiB0aGVpciBvd24gb3JpZ2luYWwgcGVyY2VudGFnZSB3aWR0aC5cclxuICAgICAgICBpZiAobmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uIDwgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25zdW1lZFdpZHRoUmlnaHRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBuZXh0Q29sdW1uSW5kZXggKyAxOyBpIDwgY29sdW1uSGVhZGVyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zICs9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2ldLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zIC0gbmV4dENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zIC0gbmV3V2lkdGhGb3JOZXh0Q29sdW1uO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFjdHVhbFdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY29sdW1uSW5kZXg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29sdW1uV2lkdGggPSBNYXRoLm1heChcclxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyAqIChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCAvIG9yaWdpbmFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMpLFxyXG4gICAgICAgICAgICAgICAgICAgIERhdGFUYWJsZUNvbXBvbmVudC5taW5Db2x1bW5XaWR0aCk7XHJcbiAgICAgICAgICAgICAgICBuZXdDb2x1bW5XaWR0aHNbaV0gPSBuZXdDb2x1bW5XaWR0aDtcclxuICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zICs9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiA9IG5ld0NvbHVtbldpZHRoc1tjb2x1bW5JbmRleF07XHJcbiAgICAgICAgICAgIG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoUmlnaHRTaWRlQ29sdW1ucyAtIGFjdHVhbFdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIG5ld1dpZHRoRm9yTmV4dENvbHVtbiBpcyBsZXNzIHRoZW4gbWluQ29sdW1uV2lkdGgsIGl0IG1lYW5zIHRoZSB1c2VyIGlzIHRyeWluZyB0byBkcmFnIHRoZSByZXNpemVyIHRvIHZlcnkgcmlnaHRcclxuICAgICAgICAvLyB0byBtYWtlIHRoZSBjdXJyZW50IGNvbHVtbiB2ZXJ5IHdpZGUuXHJcbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRyeSB0byBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgY29sdW1uIGNhbiBiZSByZXNpemVkIHRvIGFzIHdpZGUgYXMgdGhlIHVzZXIgd2FudHMuXHJcbiAgICAgICAgLy8gVGhlIHJpZ2h0IHNpZGUgY29sdW1ucyBvZiB0aGUgY3VycmVudCBjb2x1bW4gd2lsbCBiZSBzaHJ1bmsgYmFzZWQgb24gdGhlaXIgb3duIG9yaWdpbmFsIHBlcmNlbnRhZ2Ugd2lkdGguXHJcbiAgICAgICAgaWYgKG5ld1dpZHRoRm9yTmV4dENvbHVtbiA8IERhdGFUYWJsZUNvbXBvbmVudC5taW5Db2x1bW5XaWR0aCkge1xyXG4gICAgICAgICAgICBsZXQgY29uc3VtZWRXaWR0aExlZnRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvbHVtbkluZGV4IC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zICs9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2ldLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFjdHVhbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBuZXh0Q29sdW1uSW5kZXg7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29sdW1uV2lkdGggPSBNYXRoLm1heChcclxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnMgKiAoY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGggLyBvcmlnaW5hbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKTtcclxuICAgICAgICAgICAgICAgIG5ld0NvbHVtbldpZHRoc1tpXSA9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICAgICAgYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zICs9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zO1xyXG4gICAgICAgICAgICBuZXdXaWR0aEZvck5leHRDb2x1bW4gPSBuZXdDb2x1bW5XaWR0aHNbbmV4dENvbHVtbkluZGV4XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5ld0NvbHVtbldpZHRoc1tjb2x1bW5JbmRleF0gPSBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW47XHJcbiAgICAgICAgbmV3Q29sdW1uV2lkdGhzW25leHRDb2x1bW5JbmRleF0gPSBuZXdXaWR0aEZvck5leHRDb2x1bW47XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZXMgdGhlIGNvbHVtbiB3aWR0aHMgYmFzZWQgb24gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdHMuXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICBjb2x1bW4ud2lkdGggPSBuZXdDb2x1bW5XaWR0aHNbaW5kZXhdICsgJ3B4JztcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjb2x1bW4gcGVyY2VudGFnZXMgYmFzZWQgb24gdGhlIG5ldyBjb2x1bW4gd2lkdGhzLlxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4ud2lkdGhQZXJjZW50YWdlID0gY29sdW1uSGVhZGVyRWxlbWVudHNbaW5kZXhdLm9mZnNldFdpZHRoIC8gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGNvbHVtbiBjbGlja2luZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrQ29sdW1uKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uU29ydFNldHRpbmdzID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IGNvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc29ydE1vZGUgPSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkRlc2NlbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNTb3J0Q29sdW1uID0gdGhpcy5zb3J0Q29sdW1uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbiA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0SXRlbXMoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTY3JvbGxUb1NlbGVjdGlvbkFmdGVyU29ydGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RoW2ZpZWxkPVwiJyArIGNvbHVtbi5maWVsZCArICdcIl0nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0cicpLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwMCBpcyBhIHZlcnkgdHJpY2t5IG51bWJlciBoZXJlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbCwgaXQgd29uJ3QgdHJpZ2dlciB0aGUgbmFycmF0b3IuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgdG9vIGJpZywgdGhlIG5hcnJhdG9yIHdvdWxkIGZpcnN0bHkgcmVhZCB0aGUgY29udGVudCBvZiBUUiBwYXJ0aWFsbHkgdGhlbiB0aGUgY29udGVudCBvZiB0aGUgVEguXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuTm9uZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29sdW1uU29ydFNldHRpbmdzW2l0ZW0uaGVhZGVyXSA9IHRoaXMuZ2V0QXJpYVNvcnRBdHRyaWJ1dGVWYWx1ZShpdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb2x1bW5Tb3J0U2V0dGluZ3MgPSBjb2x1bW5Tb3J0U2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSByb3cgZG91YmxlIGNsaWNraW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZG91YmxlQ2xpY2tSb3coZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUoZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIHRoaXMucm93RGJsY2xpY2suZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHNjcm9sbHMgdGhlIHNlbGVjdGVkIGl0ZW0gaW50byB0aGUgdmlldyBhbmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRyeVRvTW92ZVRvQ2VudGVyPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGxldCBzZWxlY3Rpb25EYXRhID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRGF0YSA9IHRoaXMuc2VsZWN0aW9uLmRhdGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvblswXS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvblswXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5kYXRhID09PSBzZWxlY3Rpb25EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyeVRvTW92ZVRvQ2VudGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRGF0YUVsZW1lbnQgPSB0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1FbGVtZW50ID0gc2Nyb2xsRGF0YUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNtZS10YWJsZS1yb3cuc21lLXRhYmxlLXJvdy1zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1Ub3AgPSBzZWxlY3RlZEl0ZW1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjcm9sbERhdGFFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCA9IHNlbGVjdGVkSXRlbVRvcCArIHNjcm9sbERhdGFFbGVtZW50Lm9mZnNldFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGNsaWNraW5nIGJlaGF2aW9yIG9mIGNoZWNrYm94LlxyXG4gICAgICogTXVsdGlwbGUgc2VsZWN0aW9uIGJlaGF2aW9yIGlzIGhhcHBlbmluZyBoZXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25JdGVtQ2hlY2tCb3hDbGlja2VkKGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgaXNGcm9tS2V5Ym9hcmQ/OiBib29sZWFuKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgdW5jaGVja2VkLCBuZWVkIHRvIHNldCBhY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCB0byAtMSB0aGVuIHRoaXMgaXRlbSB3b24ndCBiZSBoaWdobGlnaHRlZCBpbiB0aGUgVUkuXHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGl0ZW0ubm9kZSwgIWl0ZW0ubm9kZS5zZWxlY3RlZCwgZmFsc2UsICF0aGlzLmxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ubm9kZS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZVNlbGVjdGVkLmVtaXQoeyBub2RlOiBpdGVtLm5vZGUgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGcm9tS2V5Ym9hcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSAmJiAhdGhpcy5lZGl0YWJsZSAmJiB0aGlzLmV4cGFuZFRyZWVOb2RlT25DaGVja2VkICYmIGl0ZW0uaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShudWxsLCBpdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5pbmRleE9mKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5wdXNoKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zyb21LZXlib2FyZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSB0aGlzLmZpbHRlcmVkSXRlbXMuZmlsdGVyKGN1cnJlbnRJdGVtID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGN1cnJlbnRJdGVtLCB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKSA9PT0gaXRlbS5kYXRhKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihncm91cEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1Vuc2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGdyb3VwSXRlbXNbaV0gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChncm91cEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogZ3JvdXBJdGVtc1tpXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0ZWQgJiYgIWlzRnJvbUtleWJvYXJkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTmVlZCB0byByZWNyZWF0ZSB0aGUgXCJpbnRlcm5hbFNlbGVjdGlvblwiIGFycmF5IG90aGVyd2lzZSB0aGUgY2hhbmdlIGRldGVjdG9yIHdvbid0IGRldGVjdCB0aGUgY2hhbmdlXHJcbiAgICAgICAgLy8gc2luY2UgdGhlIGFycmF5J3Mgb3duIHJlZmVyZW5jZSBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5zbGljZSgwLCB0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5pbnRlcm5hbFNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBcImNoZWNrIGFsbFwiIGNoZWNrYm94IGJlaGF2aW9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25BbGxJdGVtQ2hlY2tCb3hDbGlja2VkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCAhPT0gdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBpdGVtIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2VsZWN0ID0gIXRoaXMuc2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLCBzaG91bGRTZWxlY3QpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmludGVybmFsU2VsZWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gaXRlbSBpcyBzZWxlY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5kYXRhICYmIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihpdGVtLmRhdGEpICE9PSAtMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtcyA9IHRoaXMuZmlsdGVyZWRJdGVtcy5maWx0ZXIoY3VycmVudEl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChjdXJyZW50SXRlbSwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkgPT09IGl0ZW0uZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgaXRlbS5kYXRhID09PSB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwSXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2YoZ3JvdXBJdGVtc1tpXSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5ub2RlICYmIGl0ZW0ubm9kZS5zZWxlY3RlZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5kYXRhICYmIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubWFwKGN1cnJlbnRJdGVtID0+IGN1cnJlbnRJdGVtLmRhdGEpLmluZGV4T2YoaXRlbS5kYXRhKSAhPT0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIGEgZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBleHBhbmRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzR3JvdXBFeHBhbmRlZChncm91cDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBhbmQgc2V0cyB0aGUgdmlydHVhbCBjb3VudC5cclxuICAgICAqIEl0IG9ubHkgd29ya3Mgd2hlbiBcImxhenlMb2FkXCIgaXMgdHJ1ZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgdmlydHVhbENvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggfHwgdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB2aXJ0dWFsQ291bnQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh2YWx1ZSA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXMgPSBBcnJheSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpXSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXNvbHZlcyB0aGUgb2JqZWN0IHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGdpdmVuIHBhdGggd2l0aCBtdWx0aXBsZSBsZXZlbHMgb2YgcHJvcGVydGllcy5cclxuICAgICAqIEFuIGV4YW1wbGUgb2YgcGF0aCBpcyBcImxvY2F0aW9uLnppcENvZGVcIi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc29sdmVPYmplY3RQYXRoKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGlmIChvYmogJiYgcGF0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXRoU2VnbWVudHM6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ialtwYXRoXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRPYmogPSBvYmo7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aFNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50T2JqID0gY3VycmVudE9ialtwYXRoU2VnbWVudHNbaV1dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPYmogPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50T2JqID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRPYmo7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJldHVybnMgdGhlIGFjdGl2ZSByZW5kZXJlZCBpdGVtIGluZGV4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGlucHV0OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gaW5wdXQgPj0gMCA/IGlucHV0IDogLTE7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJldHVybnMgdGhlIGFjdGl2ZSBmb2N1c2VkIGl0ZW0gaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCA+IC0xID8gdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4IDogdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KGluZGV4OiBudW1iZXIsIGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGluZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0YWJsZSBjZWxsIGl0ZW0uXHJcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggVGhlIHJvdyBpbmRleCBmb3IgZ2V0dGluZyBhbGwgdGhlIHRhYmxlIGNlbGxzXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgSFRNTCBlbGVtZW50IGZvciB0aGUgdGFibGUgY2VsbC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFRhYmxlQ2VsbHMocm93SW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxyXG4gICAgICAgICAgICBgLnNtZS10YWJsZS1jb250YWluZXIgZGl2W3JvbGU9XCJyb3dncm91cFwiXSBkaXYuc21lLXRhYmxlLXJvdy5zbWUtdGFibGUtcm93LWRhdGEuc21lLXRhYmxlLXJvdy1zZWxlY3RhYmxlW2RhdGEtcmVuZGVyZWQtaXRlbS1pbmRleD1cIiR7cm93SW5kZXh9XCJdIGRpdltyb2xlPVwiZ3JpZGNlbGxcIl0gLnNtZS10YWJsZS1jZWxsYCk7XHJcblxyXG4gICAgICAgIHJldHVybiBjZWxscztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIGhlYWQgb2YgdGhlIHdob2xlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vdmVUb0hlYWRPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleCgwLCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBwcmV2aW91cyBwYWdlIG9mIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9QcmV2aW91c1BhZ2VPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIE1hdGgucm91bmQodGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIHByZXZpb3VzIGl0ZW0gaW4gdGhlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vdmVUb1ByZXZpb3VzUmVuZGVyZWRJdGVtKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZG9TZWxlY3Rpb24gPyB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4IC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIG5leHQgaXRlbSBpbiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICogQHBhcmFtIGRvU2VsZWN0aW9uIGlmIHRydWUgd2lsbCBkbyBzZWxlY3Rpb24gYW5kIGZvY3VzLCBvdGhlcndpc2UgZm9jdXMgb25seVxyXG4gICAgICovXHJcblxyXG4gICAgcHVibGljIG1vdmVUb05leHRSZW5kZXJlZEl0ZW0oZG9TZWxlY3Rpb24gPSB0cnVlLCBjb2x1bW5JbmRleD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGxldCBpbmRleCA9IGRvU2VsZWN0aW9uID8gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIDogdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5JbmRleCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IGNvbHVtbkluZGV4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4ICsgMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIG5leHQgcGFnZSBvZiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvTmV4dFBhZ2VPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgbmV3SW5kZXggPSBpbmRleCArIE1hdGgucm91bmQodGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleChuZXdJbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gZW5kIG9mIHRoZSB3aG9sZSByZW5kZXJlZCBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvRW5kT2ZSZW5kZXJlZEl0ZW1zKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDEsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdGl2YXRlIHRoZSByZW5kZXJlZCBpdGVtIGJ5IGNvbmRpdGlvbi5cclxuICAgICAqIEFjdGl2YXRlIGRvZXNuJ3QgbWVhbiBzZWxlY3QuIEl0IGp1c3QgaW5kaWNhdGVzIHdoaWNoIGl0ZW0gaXMgYWN0aXZlIHRvIHJlY2VpdmVkIG1vcmUgb3BlcmF0aW9ucyBlc3BlY2lhbGx5IGtleWJvYXJkIG9wZXJhdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5Q29uZGl0aW9uKGNvbmRpdGlvbjogKGl0ZW06IERhdGFUYWJsZURhdGFJdGVtKSA9PiBib29sZWFuLCBkb1NlbGVjdGlvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleCh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uaW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGUgdGhlIHJlbmRlcmVkIGl0ZW0gYnkgaW5kZXguXHJcbiAgICAgKiBBY3RpdmF0ZSBkb2Vzbid0IG1lYW4gc2VsZWN0LiBJdCBqdXN0IGluZGljYXRlcyB3aGljaCBpdGVtIGlzIGFjdGl2ZSB0byByZWNlaXZlZCBtb3JlIG9wZXJhdGlvbnMgZXNwZWNpYWxseSBrZXlib2FyZCBvcGVyYXRpb25zLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpbmRleDogbnVtYmVyLCBkb1NlbGVjdGlvbjogYm9vbGVhbiwgZG9Gb2N1czogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZG9TZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zICYmIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICYmIHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlXHJcbiAgICAgICAgICAgICYmIHRoaXMuc2VsZWN0SXRlbVdoZW5OYXZpZ2F0aW5nV2l0aEtleWJvYXJkICYmIGRvU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCB0b3RhbFNjcm9sbGFibGVTcGFjZSA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCA9IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW1TdGFydEluZGV4ID0gdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCAqIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wIC8gdG90YWxTY3JvbGxhYmxlU3BhY2VcclxuICAgICAgICAgICAgKyB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQ7XHJcblxyXG4gICAgICAgIGxldCBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA9IC0xO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSBNYXRoLmZsb29yKGN1cnJlbnRSZW5kZXJlZEl0ZW1TdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0IC0gMSkpIHtcclxuICAgICAgICAgICAgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPSBpbmRleCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kZXggPD0gY3VycmVudFJlbmRlcmVkSXRlbVN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPSBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID49IDAsIGl0IG1lYW5zIHdoZW4gdGhlIHJlbmRlcmVkIGl0ZW0gaXMgYWN0aXZhdGVkLCBpdCB0cmlnZ2VycyBzY3JvbGxpbmcgaW4gdGhlIGxpc3QuXHJcbiAgICAgICAgaWYgKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHdoYXQncyB0aGUgbmV3IHNjcm9sbFRvcCBiYXNlZCBvbiBuZXcgcmVuZGVyZWRJdGVtU3RhcnRJbmRleC5cclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gTWF0aC5mbG9vcih0b3RhbFNjcm9sbGFibGVTcGFjZSAqIChuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCAvIHRvdGFsU2Nyb2xsYWJsZUl0ZW1MZW5ndGgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0xvbmdMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGEgbG9uZyBsaXN0LCB3aGljaCBtZWFucyBvbmUgcGl4ZWwgb2Ygc2Nyb2xsYmFyIG1vdmVtZW50IGNhdXNlcyBtb3JlIHRoYW4gb25lIHNjcmVlbiBvZiB0aGUgbGlzdCBzY3JvbGxpbmcsXHJcbiAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSB0cnVuY2F0ZWQgcmVuZGVyZWQgaXRlbSBzdGFydCBpbmRleC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZFN0YXJ0SW5kZXggPSBNYXRoLmZsb29yKHNjcm9sbFRvcCAvIHRvdGFsU2Nyb2xsYWJsZVNwYWNlICogdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIGFjdHVhbCBwb3NpdGlvbiBvZiB0aGUgYWN0aXZhdGVkIHJlbmRlcmVkIGl0ZW0gbGlzdCBjYW4gYmUgbW9yZSB0aGFuIG9uZSBzY3JlZW4gYmVsb3csXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCBhbmQgdHJ1bmNhdGVkU3RhcnRJbmRleC5cclxuICAgICAgICAgICAgICAgIC8vIFRoZW4gbGF0ZXIgd2hlbiB3ZSByZW5kZXIgdGhlIGRhdGEgdGFibGUgaXRlbXMgaW4gdGhlIHZpZXcgcG9ydCwgd2Ugd2lsbCB1c2UgdGhlIG9mZnNldCB0byBhZGp1c3RcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBpdGVtIGxpc3QgdG8gbWFrZSBzdXJlIHRoZSBhY3R1YWwgYWN0aXZhdGVkIHJlbmRlcmVkIGl0ZW0gY2FuIHNob3cgdXAgaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IG5ld1JlbmRlckl0ZW1TdGFydEluZGV4IC0gdHJ1bmNhdGVkU3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydFxyXG4gICAgICAgICAgICAgICAgICAgID4gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBzY3JvbGxUb3AgYW5kIHJlLWNhbGN1bGF0ZSB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9Gb2N1cykge1xyXG4gICAgICAgICAgICBpZiAoZG9TZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNSb3dCeUluZGV4KGluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNSb3dCeUluZGV4KGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdyhpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyaWFFeHBhbmRlZEF0dHJpYnV0ZVZhbHVlKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBpc0dyb3VwRXhwYW5kZWQgPSB0aGlzLmlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChpc0dyb3VwRXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNHcm91cEV4cGFuZGVkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0xlYWYpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gKCEhKHJlbmRlcmVkSXRlbS5ub2RlICYmIHJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFkZGl0aW9uYWxTY3JlZW5SZWNvcmRlckNvbnRlbnQocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgICAgICBzd2l0Y2ggKHJlbmRlcmVkSXRlbS50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZTpcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Yk5vZGVDb3VudCA9IHJlbmRlcmVkSXRlbS5ub2RlLmNoaWxkcmVuID8gcmVuZGVyZWRJdGVtLm5vZGUuY2hpbGRyZW4ubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1Yk5vZGVDb3VudCA9PT0gMSA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5vbmVTdWJOb2RlSW5UcmVlTm9kZVxyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLm5TdWJOb2Rlc0luVHJlZU5vZGUuZm9ybWF0KHN1Yk5vZGVDb3VudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtQ291bnQgPSB0aGlzLmdyb3VwS2V5c1tyZW5kZXJlZEl0ZW0uZGF0YV0ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3JvdXBJdGVtQ291bnQgPT09IDEgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwub25lSXRlbUluR3JvdXBcclxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5uSXRlbXNJbkdyb3VwLmZvcm1hdChncm91cEl0ZW1Db3VudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRWRpdGFibGVEYXRhQ2hhbmdlZChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgZmllbGQ6IHN0cmluZykge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3cgJiYgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5pbmRleE9mKGVkaXRhYmxlRGF0YUl0ZW0uY29udGVudCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkSXRlbUluZGV4ID0gdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLmluZGV4T2YoZWRpdGFibGVEYXRhSXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkSXRlbUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5zcGxpY2UodXBkYXRlZEl0ZW1JbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW3Byb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbcHJvcGVydHldLnZhbGlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC51cGRhdGVkSXRlbXMucHVzaChlZGl0YWJsZURhdGFJdGVtLmNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc2V0RWRpdGFibGVEYXRhQ2hhbmdlc2V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0ID0ge1xyXG4gICAgICAgICAgICBhZGRlZEl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgdXBkYXRlZEl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zOiBbXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblZhbGlkYXRpb25BbGVydEhhbmRsZXIocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIGZpZWxkOiBzdHJpbmcsIGFsZXJ0OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW2ZpZWxkXSA9IGFsZXJ0O1xyXG5cclxuICAgICAgICByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdC5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uZmllbGQgJiYgZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW2NvbHVtbi5maWVsZF0gJiYgIWNvbHVtbi5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uaGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0OiBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbY29sdW1uLmZpZWxkXVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBoYXMgdmFsaWRhdGlvbiBlcnJvciBpZiB0aGVyZSBhcmUgYW55IHZhbGlkYXRpb24gYWxlcnRzXHJcbiAgICBwdWJsaWMgaGFzVmFsaWRhdGlvbkVycm9yKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0Lmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJvbGVBdHRyaWJ1dGVGb3JUcmVlVGFibGVSb3cocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldFJvbGVBdHRyaWJ1dGVGb3JUcmVlVGFibGVSb3cocmVuZGVyZWRJdGVtLCB0aGlzLnNob3dIZWFkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBcmlhU29ydEF0dHJpYnV0ZVZhbHVlKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRBcmlhU29ydEF0dHJpYnV0ZVZhbHVlKGNvbHVtbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyU2VsZWN0aW9uKGtlZXBIaWdobGlnaHRGcm9tUm93PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgha2VlcEhpZ2hsaWdodEZyb21Sb3cpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHRGcm9tUm93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgY2hlY2tJc1RhYmxlUmVuZGVyZWRPblBob25lRG93bldpdGhNaW5IZWlnaHQoc2hvdWxkRW1pdD86IGJvb2xlYW4sIGZvcmNlTGF5b3V0PzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLkRhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyXHJcbiAgICAgICAgICAgIC5jaGVja0lzVGFibGVSZW5kZXJlZE9uUGhvbmVEb3duV2l0aE1pbkhlaWdodCh0aGlzLmhlYWRlclRhYmxlRWxlbWVudCwgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50KSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3VsZEVtaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUYWJsZVJlbmRlcmVkV2l0aE1pbkhlaWdodFBob25lRG93bi5lbWl0KHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZm9yY2VMYXlvdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3VsZEVtaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1RhYmxlUmVuZGVyZWRXaXRoTWluSGVpZ2h0UGhvbmVEb3duLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZvcmNlTGF5b3V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUhpZ2hsaWdodEZyb21Sb3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgtMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5hdmlnYXRlQnlQYXRoKHBhdGhTZWN0aW9uczogc3RyaW5nW10sXHJcbiAgICAgICAgZ2V0Tm9kZUxhYmVsSGFuZGxlcjogKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pID0+IHN0cmluZyxcclxuICAgICAgICBvblRhc2tGaW5pc2hlZEhhbmRsZXI/OiAoZm91bmQ6IGJvb2xlYW4pID0+IHZvaWQsXHJcbiAgICAgICAgaXNOb2RlTG9hZGluZ0hhbmRsZXI/OiAobm9kZTogVHJlZU5vZGVEYXRhSXRlbSkgPT4gYm9vbGVhbixcclxuICAgICAgICB0aW1lb3V0ID0gNTAwMCxcclxuICAgICAgICBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlPzogYm9vbGVhbiwgbWF0Y2hGaXJzdEFGZXc/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrICYmIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmlzUnVubmluZykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vZGUgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrID0ge1xyXG4gICAgICAgICAgICBwYXRoU2VjdGlvbnM6IHBhdGhTZWN0aW9ucyxcclxuICAgICAgICAgICAgaXNSdW5uaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBjdXJyZW50UGF0aFNlY3Rpb25JbmRleDogMCxcclxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmVkSXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICBvblRhc2tGaW5pc2hlZDogb25UYXNrRmluaXNoZWRIYW5kbGVyLFxyXG4gICAgICAgICAgICBjdXJyZW50UGF0aFNlY3Rpb25TdGFydFRpbWU6IG5ldyBEYXRlKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZVBhdGhOYXZpZ2F0aW9uKFxyXG4gICAgICAgICAgICBnZXROb2RlTGFiZWxIYW5kbGVyLFxyXG4gICAgICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcixcclxuICAgICAgICAgICAgdGltZW91dCxcclxuICAgICAgICAgICAgb25seVRyaWdnZXJTZWxlY3Rpb25Gb3JMYXN0Tm9kZSxcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgbWF0Y2hGaXJzdEFGZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbGxJdGVtQ2hlY2tCb3hBcmlhTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaG91bGRBbGxJdGVtQ2hlY2tCb3hDaGVja2VkKCkgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwudW5zZWxlY3RBbGxJdGVtc1xyXG4gICAgICAgICAgICA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5zZWxlY3RBbGxJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXRJbml0aWFsSG9zdENsYXNzZXMoKS5jb25jYXQoW1xyXG4gICAgICAgICAgICAnc21lLWRhdGEtdGFibGUnXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVQYXRoTmF2aWdhdGlvbihnZXROb2RlTGFiZWxIYW5kbGVyOiAobm9kZTogVHJlZU5vZGVEYXRhSXRlbSkgPT4gc3RyaW5nLFxyXG4gICAgICAgIGlzTm9kZUxvYWRpbmdIYW5kbGVyPzogKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pID0+IGJvb2xlYW4sXHJcbiAgICAgICAgdGltZW91dD86IG51bWJlciwgb25seVRyaWdnZXJTZWxlY3Rpb25Gb3JMYXN0Tm9kZT86IGJvb2xlYW4sXHJcbiAgICAgICAgbGFzdEZvdW5kTm9kZT86IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgbWF0Y2hGaXJzdEFGZXc/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dChcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNob3VsZENvbnRpbnVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBsZXQgZm91bmROb2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmVhck1hdGNoTm9kZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleCA8IHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFJlbmRlcmVkSXRlbUluZGV4OyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZENvbnRpbnVlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gZ2V0Tm9kZUxhYmVsSGFuZGxlcih0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsID09PVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zW3RoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4XS50b0xvY2FsZUxvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlLmV4cGFuZGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXggPCB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tUcmVlVG9nZ2xlKGV2ZW50LCB0aGlzLnJlbmRlcmVkSXRlbXNbaV0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmROb2RlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Rm91bmROb2RlID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleCA9PT0gdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24gIT09IHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCB0aGlzLnJlbmRlcmVkSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5vblRhc2tGaW5pc2hlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5vblRhc2tGaW5pc2hlZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQ29udGludWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTm9kZUxvYWRpbmdIYW5kbGVyIHx8ICFpc05vZGVMb2FkaW5nSGFuZGxlcih0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleCA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvblN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5lYXJNYXRjaE5vZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnNbdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXhdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGFiZWwuaW5kZXhPZih0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnNbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4XS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lYXJNYXRjaE5vZGUgPSB0aGlzLnJlbmRlcmVkSXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGVwdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFJlbmRlcmVkSXRlbUluZGV4IC0gMV0uZGVwdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRDb250aW51ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZE5vZGUgJiYgbm93LmdldFRpbWUoKSAtIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvblN0YXJ0VGltZS5nZXRUaW1lKCkgPiB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sub25UYXNrRmluaXNoZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWFyTWF0Y2hOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG51bGwsIG5lYXJNYXRjaE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RGb3VuZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0obnVsbCwgbGFzdEZvdW5kTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTZWxlY3RlZEl0ZW1JbnRvVmlldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGF0aE5hdmlnYXRpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb2RlTGFiZWxIYW5kbGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOb2RlTG9hZGluZ0hhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRyaWdnZXJTZWxlY3Rpb25Gb3JMYXN0Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RGb3VuZE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZpcnN0QUZldyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVVJKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGVtcFJvd0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc29ydEl0ZW1zKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXMgJiYgdGhpcy5zb3J0Q29sdW1uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVGdW5jdGlvbiA9IHRoaXMuc29ydENvbHVtbi5zb3J0YWJsZSA9PT0gJ2N1c3RvbScgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb3J0Q29sdW1uLmNvbXBhcmVGdW5jdGlvbi5iaW5kKHRoaXMpIDogdGhpcy5kZWZhdWx0U29ydENvbXBhcmVGdW5jdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICBjb25zdCBzb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0Q29sdW1uLnNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQgPyAxIDogLTE7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZ3JvdXBDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIGxldCBlZGl0YWJsZU5ld1Jvd1JlbmRlcmVkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSAmJiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxhc3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZWRJdGVtLmRhdGEuaXNOZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVOZXdSb3dSZW5kZXJlZEl0ZW0gPSByZW5kZXJlZEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5zcGxpY2UodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDEsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxyZWFkeUxvYWRlZEFsbERhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmVkSXRlbXNbaV0gfHwgIXRoaXMucmVuZGVyZWRJdGVtc1tpXS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUxvYWRlZEFsbERhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0Q29sdW1uID09PSB0aGlzLnByZXZpb3VzU29ydENvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5yZW5kZXJlZEl0ZW1zLnJldmVyc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeUxvYWRlZEFsbERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNbaV0gPSB7IGluZGV4OiBpLCBkYXRhOiB1bmRlZmluZWQsIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuTm9ybWFsIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRGYWxsQmFja1RvRGVmYXVsdFNvcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZG9DdXN0b21Tb3J0LmVtaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogc29ydERpcmVjdGlvbiwgZmllbGQ6IHRoaXMuc29ydENvbHVtbi5maWVsZCwgZmFsbEJhY2tUb0RlZmF1bHRTb3J0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEZhbGxCYWNrVG9EZWZhdWx0U29ydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZEZhbGxCYWNrVG9EZWZhdWx0U29ydCB8fCB0aGlzLmRvQ3VzdG9tU29ydC5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSB0aGlzLnJlbmRlcmVkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YSwgYi5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSB0aGlzLnJlbmRlcmVkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YS5jb250ZW50LCBiLmRhdGEuY29udGVudCwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGluIFwiZWxzZVwiIGJsb2NrIGhhbmRsZXMgdGhlIHNvcnQgaW4gdGhlIHRyZWUgbm9kZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IHNvcnRzIHRoZSB0cmVlIG5vZGVzIG9ubHkgaW4gaXRzIG93biB0cmVlIGxldmVsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IG5vZGVzIGhhdmUgc3ViIG5vZGVzIGFuZCBvdGhlciBub2RlcyBkb24ndCBoYXZlIHN1YiBub2RlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHB1dCB0aGUgbm9kZXMgd2l0aCBzdWIgbm9kZXMgaW4gZnJvbnQgb2YgdGhlIG5vZGVzIHdpdGhvdXQgc3ViIG5vZGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IFt0aGlzLnNoYWRvd1RyZWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKGN1cnJlbnROb2RlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suc3BsaWNlKHN0YWNrLmxlbmd0aCAtIDEsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gY3VycmVudE5vZGUuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGNvbXBhcmUgcmVzdWx0IGFib3V0IDEgb3IgLTEgaXMgcmV2ZXJzZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUgaWYgYSBpcyBncmVhdGVyIHRoYW4gYiwgMSB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgLTEuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBiZWNhdXNlIHRob3NlIG5vZGVzIGFyZSB3ZW50IHRob3VnaCBpbiB0aGUgc3RhY2sgd2l0aCBpcyBGSUZPLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBvcmRlciBpcyByZXZlcnNlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0Q29sdW1uID09PSB0aGlzLmFjdHVhbENvbHVtbnNbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZGF0YS5oYXNDaGlsZHJlbiAmJiAhYi5kYXRhLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYS5kYXRhLmhhc0NoaWxkcmVuICYmIGIuZGF0YS5oYXNDaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChhLmRhdGEuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYlZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChiLmRhdGEuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBiVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlICE9PSB1bmRlZmluZWQgJiYgYlZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLXNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLmRhdGEsIGIuZGF0YS5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVOZXdSb3dSZW5kZXJlZEl0ZW0gJiYgdGhpcy5lZGl0YWJsZUF1dG9OZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaChlZGl0YWJsZU5ld1Jvd1JlbmRlcmVkSXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaGFuZGxlcyB0aGUgc29ydGluZyB3aGVuIGdyb3VwaW5nIGlzIGVuYWJsZWQuXHJcbiAgICAgICAgICAgICAgICAvLyBJdCBzb3J0cyB0aGUgZ3JvdXAgaXRlbXMgaW4gZWFjaCBvZiB0aGUgZ3JvdXAuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRSZW5kZXJlZEl0ZW1zOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwZWRSZW5kZXJlZEl0ZW1zOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cGVkUmVuZGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMgPSBncm91cGVkUmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLCBiLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkUmVuZGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkUmVuZGVyZWRJdGVtcy5wdXNoKHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMucHVzaCh0aGlzLnJlbmRlcmVkSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChncm91cGVkUmVuZGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zID0gZ3JvdXBlZFJlbmRlcmVkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEsIGIuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRSZW5kZXJlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBzb3J0ZWRSZW5kZXJlZEl0ZW1zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uKGE6IERhdGFUYWJsZURhdGFJdGVtLCBiOiBEYXRhVGFibGVEYXRhSXRlbSwgZmllbGQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XHJcblxyXG4gICAgICAgIGlmICghYSAmJiAhYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWEgJiYgYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYSAmJiAhYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYVZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChhLCBmaWVsZCk7XHJcbiAgICAgICAgICAgIGxldCBiVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGIsIGZpZWxkKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdHlwZW9mIGFWYWx1ZTtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgYVZhbHVlID0gYVZhbHVlID09PSAwID8gYVZhbHVlIDogKGFWYWx1ZSB8fCBOdW1iZXIuTUlOX1ZBTFVFKTtcclxuICAgICAgICAgICAgICAgIGJWYWx1ZSA9IGJWYWx1ZSA9PT0gMCA/IGJWYWx1ZSA6IChiVmFsdWUgfHwgTnVtYmVyLk1JTl9WQUxVRSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA+IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYVZhbHVlID0gYVZhbHVlICYmIGFWYWx1ZS50b1N0cmluZyAmJiBhVmFsdWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgYlZhbHVlID0gYlZhbHVlICYmIGFWYWx1ZS50b1N0cmluZyAmJiBiVmFsdWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHdlIGRvIG5hdHVyYWwgc29ydCBoZXJlLlxyXG4gICAgICAgICAgICAgICAgLy8gQmFzZWQgb24gc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLCBcImExMDBcIixcImEyMFwiLFwiYTNcIiB3aWxsIGJlIHNvcnRlZCBhcyBcImExMDBcIixcImEyMFwiLFwiYTNcIi5cclxuICAgICAgICAgICAgICAgIC8vIEJ1dCBiYXNlZCBvbiBuYXR1cmFsIHNvcnQsIHRoZXkgd2lsbCBiZSBzb3J0ZWQgYXMgXCJhM1wiLFwiYTIwXCIsXCJhMTAwXCIuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZU5hdHVyYWxTb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNOdW1iZXIgPSAodGV4dDogc3RyaW5nKSA9PiB0ZXh0ID49ICcwJyAmJiB0ZXh0IDw9ICc5JztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCAxLCBmaWd1cmUgb3V0IHRoZSBjb21tb24gcGFydCBvZiAyIHN0cmluZ3MuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBhVmFsdWUubGVuZ3RoICYmIGluZGV4IDwgYlZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbHVlW2luZGV4XSAhPT0gYlZhbHVlW2luZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgMiwgaWYgdGhlIHJlc3QgcGFydCBvZiBlYWNoIHN0cmluZyBzdGFydHMgd2l0aCBhIG51bWJlciwgcGFyc2UgdGhlIHJlc3QgcGFydCBpbnRvIGZsb2F0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlRmxvYXQgZnVuY3Rpb24gaXMgdmVyeSBkdXJhYmxlLCBpdCBjYW4gcGFyc2UgXCIxLjVhYmNcIiBhcyBcIjEuNVwiIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgdGhhdCB0aGUgcmVzdCBwYXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN0cmluZyBpcyBtaXhlZCB3aXRoIG51bWJlcnMgYW5kIGxldHRlcnMuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3QgcGFydCBvZiBlYWNoIHN0cmluZyBkb2Vzbid0IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZW4gZG9uJ3QgZG8gbmF0dXJhbCBzb3J0LCBqdXN0IGRvIG5vcm1hbCBzdHJpbmcgc29ydC5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIoYVZhbHVlW2luZGV4XSkgJiYgaXNOdW1iZXIoYlZhbHVlW2luZGV4XSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU51bWJlciA9IHBhcnNlRmxvYXQoYVZhbHVlLnN1YnN0cmluZyhpbmRleCwgYVZhbHVlLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiTnVtYmVyID0gcGFyc2VGbG9hdChiVmFsdWUuc3Vic3RyaW5nKGluZGV4LCBiVmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhTnVtYmVyID4gYk51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhTnVtYmVyIDwgYk51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbHVlID4gYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWUgPiBiVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhc1ZlcnRpY2FsT3ZlcmZsb3coKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgPiB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnblNjcm9sbEJhcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBoYXNWZXJ0aWNhbE92ZXJmbG93ID0gdGhpcy5oYXNWZXJ0aWNhbE92ZXJmbG93KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVNjcm9sbGJhcldpZHRoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoYXNWZXJ0aWNhbE92ZXJmbG93ICE9PSB0aGlzLmN1cnJlbnRIYXNWZXJ0aWNhbE92ZXJmbG93ICYmIHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChoYXNWZXJ0aWNhbE92ZXJmbG93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gJ2NhbGMoMTAwJSAtICcgKyB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCArICdweCknO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gdGhpcy5jYWxjdWxhdGVkU2Nyb2xsYmFyV2lkdGggKyAncHgnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5yaWdodCA9ICcwcHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudEhhc1ZlcnRpY2FsT3ZlcmZsb3cgPSBoYXNWZXJ0aWNhbE92ZXJmbG93O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlU2Nyb2xsYmFyV2lkdGgoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsRGl2KTtcclxuICAgICAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gJ3NtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLXN0cmV0Y2ggc21lLWFycmFuZ2Utb3ZlcmZsb3ctc2Nyb2xsJztcclxuICAgICAgICBzY3JvbGxEaXYuc3R5bGUudG9wID0gJy05OTk5cHgnO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gc2Nyb2xsRGl2Lm9mZnNldFdpZHRoIC0gc2Nyb2xsRGl2LmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkU2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxiYXJXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KHByZXZlbnRTY3JvbGxpbmc/OiBib29sZWFuLCBmb3JjZVVwZGF0ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkICYmIHRoaXMucmVuZGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAvLyBTY3JvbGwgY29udGFpbmVyIGlzIHRoZSBkaXYgdG8gcmVuZGVyIHRoZSB2aWV3IHBvcnQgb2YgdGhlIGRhdGEgdGFibGUgYW5kIHRvIHByb3ZpZGUgdGhlIHNjcm9sbCBiYXIuXHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZXMgaG93IG1hbnkgaXRlbXMgY2FuIGJlIHJlbmRlcmVkIGluIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCA9IHRoaXMuc2Nyb2xsYWJsZVxyXG4gICAgICAgICAgICAgICAgPyBNYXRoLm1pbih0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLCBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAvIHRoaXMucm93SGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U2Nyb2xsUGl4ZWxzID0gdGhpcy5kZWZhdWx0U2Nyb2xsUGVyY2VudGFnZSAqIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U2Nyb2xsUGl4ZWxzID0gTWF0aC5mbG9vcihkZWZhdWx0U2Nyb2xsUGl4ZWxzIC8gdGhpcy5yb3dIZWlnaHQpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcclxuICAgICAgICAgICAgbGV0IGlzQXRMYXN0U2NyZWVuID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVuZGVyZWRJdGVtU3RhcnQgPSAwO1xyXG4gICAgICAgICAgICBsZXQgcmVuZGVyZWRJdGVtRW5kID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlVUlWaXJ0dWFsaXphdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTG9uZ0xpc3QgJiYgcHJldmVudFNjcm9sbGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNjcm9sbFRvcCA9IChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0IC8gKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB0aGlzLmN1cnJlbnRTdGFydEluZGV4T2ZJdGVtSW5WaWV3UG9ydDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5kYXRhU2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGVzIHRoZSB3aGljaCBpdGVtIGlzIHRoZSBzdGFydGluZyBpdGVtIGluIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGlkZWEgaGVyZSBpcyB0byBjYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2Ugb2YgaG93IGZhciB0aGUgc2Nyb2xsYmFyIG1vdmVkLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkaXN0YW5jZSB0aGUgc2Nyb2xsYmFyIGNhbiBtb3ZlIGlzIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIHNjcm9sbGJhciBtaW51cyB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydC5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcih0aGlzLmRhdGFTY3JvbGxUb3ApICE9PSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTY3JvbGxUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY3VyYXRlU3RhcnRJbmRleCA9ICh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KSAqIHRoaXMuZGF0YVNjcm9sbFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvIChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5mbG9vcihhY2N1cmF0ZVN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ID4gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBdExhc3RTY3JlZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGFydEluZGV4T2ZJdGVtSW5WaWV3UG9ydCA9IHN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgc2hvcnQgYW5kIG5vIG5lZWQgdG8gaGF2ZSBzY3JvbGwgYmFyLCBqdXN0IHNpbXBseSBzZXQgdGhlIHN0YXJ0IGluZGV4IHRvIDAuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHQgPD0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW1TdGFydCA9IHN0YXJ0SW5kZXggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKiB0aGlzLmJ1ZmZlclJvd1JhdGU7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGlzdCBpZiBzaG9ydCwgcmVuZGVyZWRJdGVtRW5kIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LlxyXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBzaG91bGQgYmUgdGhlIHN0YXJ0IGluZGV4IHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBpbiB0aGUgdmlldyBwb3J0IHBsdXMgdGhlIGxlbmd0aCAqIGJ1ZmZlciByYXRlLlxyXG4gICAgICAgICAgICAgICAgcmVuZGVyZWRJdGVtRW5kID0gTWF0aC5taW4odGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCwgTWF0aC5jZWlsKHN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnRcclxuICAgICAgICAgICAgICAgICAgICArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAqIHRoaXMuYnVmZmVyUm93UmF0ZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc2hvdWxkTGF6eUxvYWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGxvZ2ljIGNhbGN1bGF0ZXMgd2hpY2ggcGFydCBvZiBkYXRhIHNob3VsZCBiZSBsb2FkZWQgd2l0aCB0aGUgbGF6eSBsb2FkaW5nIGV2ZW50LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF6eUxvYWRTdGFydCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmVuZGVyZWRJdGVtU3RhcnQpKTtcclxuICAgICAgICAgICAgICAgIGxldCBhY3R1YWxMYXp5TG9hZFN0YXJ0ID0gbGF6eUxvYWRTdGFydDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhenlMb2FkTGVuZ3RoID0gTWF0aC5taW4odGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCwgcmVuZGVyZWRJdGVtRW5kKSAtIGxhenlMb2FkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWN0dWFsTGF6eUxvYWRMZW5ndGggPSBsYXp5TG9hZExlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gbGF6eUxvYWRTdGFydDsgaSA8IGxhenlMb2FkU3RhcnQgKyBsYXp5TG9hZExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVySXRlbUZsYWcgPSAoIXRoaXMucmVuZGVyZWRJdGVtc1tpXSB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkTGF6eUxvYWQgJiYgcmVuZGVySXRlbUZsYWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkTGF6eUxvYWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxMYXp5TG9hZFN0YXJ0ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZExhenlMb2FkICYmICFyZW5kZXJJdGVtRmxhZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGF6eUxvYWRMZW5ndGggPSBpICsgMSAtIGFjdHVhbExhenlMb2FkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFjdHVhbExhenlMb2FkTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkTGF6eUxvYWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTGF6eUxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc29ydE9yZGVyID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zb3J0Q29sdW1uLnNvcnRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5EZXNjZW5kOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXp5TG9hZEV2ZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogYWN0dWFsTGF6eUxvYWRTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBhY3R1YWxMYXp5TG9hZExlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoTG9hZGluZ0RhdGE6IChpdGVtcywgYWxsSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc1thY3R1YWxMYXp5TG9hZFN0YXJ0ICsgaV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogYWN0dWFsTGF6eUxvYWRTdGFydCArIGksIGRhdGE6IGl0ZW1zW2ldLCB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLk5vcm1hbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNldCBpbnRlcm5hbCBpdGVtcyBzbyB0aGF0IHdlIGNhbiBzZWxlY3QgYWxsLCBhbmQgc28gd2UgY2FuIGRvIGZpbHRlcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IGFsbEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlcigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgcmVmcmVzaCB0byBtYWtlIHRoZSBjaGFuZ2VzIHJlZmxlY3Qgb24gVUksIHdpbGwgbm90IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyBhZnRlciBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQsIHRoZSBzaG91bGRMYXp5TG9hZCB3aWxsIGJlIHNldCB0byBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyOiBzb3J0T3JkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGaWVsZDogdGhpcy5zb3J0Q29sdW1uID8gdGhpcy5zb3J0Q29sdW1uLmZpZWxkIDogdGhpcy5hY3R1YWxDb2x1bW5zID8gdGhpcy5hY3R1YWxDb2x1bW5zWzBdLmZpZWxkIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXp5TG9hZGluZ0RhdGEuZW1pdChsYXp5TG9hZEV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbExhenlMb2FkTGVuZ3RoID49IHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAqIHRoaXMuYnVmZmVyUm93UmF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQnVzeSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNob3VsZExhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBkaXNwbGF5aW5nIGxpc3QgaXRlbSBpbiB0aGUgdmlldyBwb3J0IGlzIG1vdmluZyBkdWUgdG8gc2Nyb2xsIGJhciBpcyBtb3ZpbmcsXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdG9wIG9mIHRoZSBzY3JvbGwgZGF0YSBlbGVtZW50LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGl0ZW0gb2YgdGhlIHNjcm9sbCBkYXRhIGVsZW1lbnQgd29uJ3QgYWx3YXlzIGFsaWdoIHRvIHRoZSB0b3Agb2YgdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgICAgIC8vIFNvIGhlcmUgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgJSB0aGlzLnJvd0hlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiB3aGVuIHRoZSBkaXNwbGF5IGl0ZW0gbGlzdCBpcyBldmVuIGxvbmdlciB0aGFuIHRoZSBzY3JvbGwgY29udGFpbmVyIGhlaWdodCAqIHJvdyBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAvLyBpdCBtZWFucyB3aGVuIHdlIG1vdmUgMSBwaXhlbCBvZiB0aGUgc2Nyb2xsIGJhciwgdGhlIGRhdGEgdGFibGUgd2lsbCBtb3ZlIGJ5IGF0IGxlYXN0IG9uZSBpdGVtLlxyXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB3b24ndCBuZWVkIHRvIGhhbmRsZSBvZmZzZXQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGNoYW5jZSB0byBzaG93IFwiaGFsZiBkYXRhIHRhYmxlIGl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgLy8gYXQgdGhlIHRvcCBib3JkZXIgb2YgdGhlIHNjcm9sbCBjb250YWluZXIgYnkgbW92aW5nIHRoZSBzY3JvbGwgYmFyIHZlcnkgbGl0dGxlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggPiBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAqIHRoaXMucm93SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZVVJVmlydHVhbGl6YXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlJdGVtc1RvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wIC0gb2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggPiBzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0IC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBzZWxlY3RlZEl0ZW1JbmRleCA8IHN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SXRlbXNUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoc2VsZWN0ZWRJdGVtSW5kZXggLSBzdGFydEluZGV4IC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ICsgMSkgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHNjcm9sbCBiYXIgaXMgbW92ZWQgdG8gdmVyeSBib3R0b20sIHdlIGp1c3Qgc2ltcGx5IGFsaWduIHRoZSBkaXNwbGF5ZWQgZGF0YSB0YWJsZSBpdGVtcydzIGJvdHRvbVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBib3R0b20gb2YgdGhlIGNvbnRhaW5lciB0byBtYWtlIHN1cmUgdGhlIGxhc3QgZGF0YSB0YWJsZSBpdGVtIGNhbiBiZSBkaXNwbGF5ZWQgY29tcGxldGVseS5cclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdoZW4gdGhlIGxpc3QgaXMgc3VwZXIgbG9uZyAocmVmZXIgdG8gaG93IHdlIGNhbGN1bGF0ZSB0aGUgdG9wIG9mZnNldCBvZiB0aGUgc3VwZXIgbG9uZyBsaXN0KSxcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBpdGVtIG1heSBub3QgYmUgcmVuZGVyZWQgY29tcGxldGVseS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA+IHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0ICogdGhpcy5yb3dIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgPj1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHQgLSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMucm93SGVpZ2h0IC8gMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0F0TGFzdFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlJdGVtc1RvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE1hdGguY2VpbCh0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERhdGFTdHlsZVRvcCA9IHRoaXMuZGlzcGxheUl0ZW1zVG9wICsgJ3B4JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2VVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxBYm92ZURhdGFFbGVtZW50KE1hdGgucm91bmQoc3RhcnRJbmRleCAtIHJlbmRlcmVkSXRlbVN0YXJ0KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCghdGhpcy5jdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydCB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW3N0YXJ0SW5kZXhdXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKHRoaXMucmVuZGVyZWRJdGVtc1tzdGFydEluZGV4XS5kYXRhICE9PSB0aGlzLmN1cnJlbnRSZW5kZXJlZEl0ZW1JblZpZXdQb3J0LmRhdGEpKVxyXG4gICAgICAgICAgICAgICAgICAgIHx8IGZvcmNlVXBkYXRlIHx8IHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIGRpc3BsYXkgZGF0YSBhYm92ZSB0aGUgdmlldyBwb3J0IGFuZCBkaXNwbGF5IGRhdGEgaW4gYW5kIGJlbG93IHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2hlbiB3ZSBwdXNoIG5ldyBpdGVtIGludG8gdGhlIGFycmF5cywgd2UgY3JlYXRlIGEgbmV3IG9iamVjdCB0byB3cmFwIHRoZSBkaXNwbGF5IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSB3YW50IHRvIGZvcmNlIHRoZSBuZ0ZvciB0byByZS1yZW5kZXIgYWxsIHRoZSBpdGVtcyBpbnN0ZWFkIG9mIG9ubHkgcmUtcmVuZGVyIHRoZSB1cGRhdGVkIG9uZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBuZ0ZvciB3aWxsIHRyeSB0byBhZGp1c3QgRE9NIG9yZGVyIG9mIHRob3NlIGl0ZW1zIHdoaWNoIG1lc3NlcyB1cCB0aGUgc2Nyb2xsIGJhciBwb3NpdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRTY3JvbGwgPSB0aGlzLnNjcm9sbGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRoaXMuZWRpdGFibGUgfHwgdGhpcy5hdXRvUm93SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTY3JvbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlbmRlcmVkSXRlbVN0YXJ0OyBpIDwgc3RhcnRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBzdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY3VycmVudFJlbmRlcmVkSXRlbS50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zaG93QXNUcmVlID8gY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmRhdGEgOiBjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogY3VycmVudFJlbmRlcmVkSXRlbS5kZXB0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuOiBjdXJyZW50UmVuZGVyZWRJdGVtLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogY3VycmVudFJlbmRlcmVkSXRlbS5wb3NpdGlvbkluU2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogY3VycmVudFJlbmRlcmVkSXRlbS5zZXRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogY3VycmVudFJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQucHVzaCh7IGRhdGE6IHsgcGxhY2Vob2xkZXI6IHRydWUgfSwgdHlwZTogbnVsbCwgaW5kZXg6IG51bGwgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgcmVuZGVyZWRJdGVtRW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnNob3dBc1RyZWUgPyBjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUuZGF0YSA6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogY3VycmVudFJlbmRlcmVkSXRlbS5kZXB0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbjogY3VycmVudFJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5TZXQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0ucG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplOiBjdXJyZW50UmVuZGVyZWRJdGVtLnNldFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogY3VycmVudFJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNjcm9sbGFibGUgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA+IHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0LnB1c2goeyBkYXRhOiB7IHBsYWNlaG9sZGVyOiB0cnVlIH0sIHR5cGU6IG51bGwsIGluZGV4OiBudWxsIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydCA9IHRoaXMucmVuZGVyZWRJdGVtc1tzdGFydEluZGV4XTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudEFyZWFIYXNGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzU21lRm9ybUZpZWxkKDxIVE1MRWxlbWVudD5kb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBqdW1wIGZyb20gZWRpdGFibGUgZm9ybSBmaWVsZHMgdG93YXJkcyB0aGUgcm93IHdoZW4gcmUtY2FsY3VsYXRpbmcgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdmFsaWRhdGlvbiBlcnJvcnMgb24gd2luZG93IHJlc2l6aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggIT09IHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzRmlsdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCA9IHRoaXMuaW50ZXJuYWxRdWVyeUVkaXRvcjtcclxuICAgICAgICBjb25zdCBoYXNWYWxpZFF1ZXJ5RWRpdG9yID0gKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCAmJiB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMgJiZcclxuICAgICAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxJdGVtcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlciBpbnN0YW5jZW9mIFNlYXJjaEZvcm1GaWVsZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaEZvcm1GaWVsZCA9IDxTZWFyY2hGb3JtRmllbGRDb21wb25lbnQ+dGhpcy5nbG9iYWxGaWx0ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0gc2VhcmNoRm9ybUZpZWxkLnZhbHVlICYmIHNlYXJjaEZvcm1GaWVsZC52YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0gdGhpcy5nbG9iYWxGaWx0ZXJbJ3ZhbHVlJ10gPyB0aGlzLmdsb2JhbEZpbHRlclsndmFsdWUnXS50b0xvY2FsZUxvd2VyQ2FzZSgpLnRyaW0oKSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyS2V5d29yZCAmJiAhaGFzVmFsaWRRdWVyeUVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5pbnRlcm5hbEl0ZW1zLm1hcChpdGVtID0+IGl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW50ZXJuYWxJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgZmlsdGVyIGJ5IHRoZSBtYXN0ZXIgdmlldyBmaWx0ZXJzIGlmIGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgIC8vIFRoZW4gZmlsdGVyIGJ5IHRoZSBjb2x1bW4gZmlsdGVyc1xyXG4gICAgICAgICAgICAgICAgLy8gTm90ZSBmaWx0ZXIgaW5zaWRlIHRoZSBjb2x1bW4gZmlsdGVycyBhcmUgaW50ZXJzZWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgLy8gQ29sdW1uIGZpbHRlcnMgbXVsdGlwbGUgY29tYm9ib3ggd2lsbCBiZSB1bmlvblxyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW50ZXJuYWxJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmludGVybmFsSXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gdGhlIGRhdGF0YWJsZSBvcmlnaW5hbCBmaWx0ZXJzIG9ubHkgaWYgdXNlZCBpbiBtYXN0ZXIgdmlldy5cclxuICAgICAgICAgICAgICAgICAgICAvLyBBbmQgaGFzIHZhbGlkIGZpbHRlcktleXdvcmRcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJLZXl3b3JkICYmIHRoaXMuZmlsdGVyS2V5d29yZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQgJiYgY29sdW1uLnNlYXJjaGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGl0ZW0sICh0aGlzLmVkaXRhYmxlID8gJ2NvbnRlbnQuJyA6ICcnKSArIGNvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4uZmlsdGVyT3ZlcnJpZGluZ0Z1bmN0aW9uKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FzZVNlbnNpdGl2ZUZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuaW5kZXhPZih0aGlzLmZpbHRlcktleXdvcmQpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBmaWx0ZXJLZXl3b3JkIGlzIGVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoaXMgZGF0YXRhYmxlIGlzIG5vdCB1c2VkIGluIG1hc3RlciB2aWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZm91bmQgYnkgZGF0YXRhYmxlIG9yaWdpbmFsIGZpbHRlcihmcm9tIG1hc3RlciB2aWV3KVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIGlmIG9yaWdpbmFsIGZpbHRlciBpcyBlbXB0eShub3QgaW4gbWFzdGVyIHZpZXcpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNWYWxpZFF1ZXJ5RWRpdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgYnkgcXVlcnkgZWRpdG9yIGlmIGFwcGxpZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdGhpcy5xdWVyeUVkaXRvckZpbHRlck1haW4odmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBzYXRpc2Z5IGJvdGggb3JpZ2luYWwgZmlsdGVycyBhbmQgdGhlIHF1ZXJ5IGVkaXRvciBmaWx0ZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUFyaWFBdHRyaWJ1dGVzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGFibGVBcmlhTGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aGlzLnRhYmxlQXJpYUxhYmVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy50YWJsZUFyaWFMYWJlbGxlZEJ5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknLCB0aGlzLnRhYmxlQXJpYUxhYmVsbGVkQnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlIHx8IHRoaXMuc2VsZWN0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKFxyXG4gICAgICAgICAgICAgICAgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJyxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ211bHRpcGxlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVHJlZU5vZGUobm9kZTogVHJlZU5vZGVEYXRhSXRlbSwgZGVwdGg6IG51bWJlciwgcGFyZW50U2hhZG93VHJlZU5vZGU6IGFueSwgcG9zaXRpb25JblNldDogbnVtYmVyLCBzZXRTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZW1lbWJlclRyZWVOb2RlVG9nZ2xlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5nZXRUcmVlTm9kZURhdGFJZGVudGl0eShub2RlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJlZVRvZ2dsZVN0YXR1cy5oYXNPd25Qcm9wZXJ0eShpZGVudGl0eSkpIHtcclxuICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSB0aGlzLnRyZWVUb2dnbGVTdGF0dXNbaWRlbnRpdHldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBoYXNDaGlsZHJlbiA9IG5vZGUuY2FuRXhwYW5kIHx8IG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwO1xyXG4gICAgICAgIG5vZGUuaXNMZWFmID0gIWhhc0NoaWxkcmVuO1xyXG5cclxuICAgICAgICBjb25zdCByZW5kZXJlZEl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IG5vZGUuZGF0YSxcclxuICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZSxcclxuICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxyXG4gICAgICAgICAgICBoYXNDaGlsZHJlbjogaGFzQ2hpbGRyZW4sXHJcbiAgICAgICAgICAgIG5vZGU6IG5vZGUsXHJcbiAgICAgICAgICAgIGluZGV4OiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBwb3NpdGlvbkluU2V0LFxyXG4gICAgICAgICAgICBzZXRTaXplOiBzZXRTaXplXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaChyZW5kZXJlZEl0ZW0pO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50U2hhZG93VHJlZU5vZGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHJlbmRlcmVkSXRlbSxcclxuICAgICAgICAgICAgY2hpbGRyZW46IFtdXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gV2UgbmVlZCB0byBtYWludGFpbiBhIHNoYWRvdyB0cmVlIHRvIGhhbmRsZSB0aGUgXCJzYW1lIGxldmVsIG9ubHlcIiBzb3J0aW5nLlxyXG4gICAgICAgIHBhcmVudFNoYWRvd1RyZWVOb2RlLmNoaWxkcmVuLnB1c2goY3VycmVudFNoYWRvd1RyZWVOb2RlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkICYmIG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbkluU2V0ID0gMTtcclxuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlKGNoaWxkLCBkZXB0aCArIDEsIGN1cnJlbnRTaGFkb3dUcmVlTm9kZSwgY3VycmVudFBvc2l0aW9uSW5TZXQsIG5vZGUuY2hpbGRyZW4ubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbkluU2V0Kys7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlUmVuZGVySXRlbXMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBDb2x1bW4gJiYgdGhpcy5ncm91cENvbHVtbi5maWVsZCkge1xyXG4gICAgICAgICAgICB0aGlzLmdyb3VwS2V5cyA9IHt9O1xyXG4gICAgICAgICAgICBjb25zdCBncm91cHM6IHsgZ3JvdXA6IERhdGFUYWJsZURhdGFJdGVtLCBpdGVtczogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW10gfVtdID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFNvcnRNb2RlICE9PSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJlRnVuY3Rpb24gPSB0aGlzLmdyb3VwQ29sdW1uLnNvcnRhYmxlID09PSAnY3VzdG9tJyA/XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cENvbHVtbi5jb21wYXJlRnVuY3Rpb24uYmluZCh0aGlzKSA6IHRoaXMuZGVmYXVsdFNvcnRDb21wYXJlRnVuY3Rpb24uYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPSB0aGlzLmdyb3VwU29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZCA/IDEgOiAtMTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLmZpbHRlcmVkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLCBiLCB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBEYXRhID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChpdGVtLCB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ3JvdXBLZXlzW2dyb3VwRGF0YV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cHMucHVzaCh7IGdyb3VwOiBncm91cERhdGEsIGl0ZW1zOiBncm91cEl0ZW1zIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdID0gZ3JvdXBJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBEYXRhXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBEYXRhXSA9IHRoaXMuZGVmYXVsdEdyb3VwVG9nZ2xlRXhwYW5kZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBLZXlzW2dyb3VwRGF0YV0ucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBncm91cHNbaV0uZ3JvdXAsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcixcclxuICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBpICsgMSxcclxuICAgICAgICAgICAgICAgICAgICBzZXRTaXplOiBncm91cHMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3Vwc1tpXS5ncm91cF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudFBvc2l0aW9uSW5TZXQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tpXS5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5TZXQ6IGN1cnJlbnRQb3NpdGlvbkluU2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogZ3JvdXBzW2ldLml0ZW1zLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uSW5TZXQrKztcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnNoYWRvd1RyZWUgPSB7IGRhdGE6IG51bGwsIGNoaWxkcmVuOiBbXSB9O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbkluU2V0ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlKG5vZGUsIDAsIHRoaXMuc2hhZG93VHJlZSwgY3VycmVudFBvc2l0aW9uSW5TZXQsIHRoaXMuaXRlbXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25JblNldCsrO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVySXRlbSA9IDxEYXRhVGFibGVSZW5kZXJlZEl0ZW0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgrKyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5maWx0ZXJlZEl0ZW1zW2ldLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLk5vcm1hbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogW11cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaChyZW5kZXJJdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSB0aGlzLmZpbHRlcmVkSXRlbXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCsrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLk5vcm1hbFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVuZGVySXRlbXMocHJldmVudFNjcm9sbGluZz86IGJvb2xlYW4sIGZvcmNlVXBkYXRlPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gIXRoaXMuaXRlbXM7XHJcblxyXG4gICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlcigpO1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVSZW5kZXJJdGVtcygpO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGVzIGhvdyBoaWdoIHRoZSBzY3JvbGwgZGF0YSBkaXYgc2hvdWxkIGJlLlxyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXMgJiYgIXRoaXMuZGlzYWJsZVVJVmlydHVhbGl6YXRpb24pIHtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggKiB0aGlzLnJvd0hlaWdodDtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBoZWlnaHQgaXMgdG9vIG11Y2gsIHdlIG5lZWQgdG8gbGltaXRlZCB0aGUgaGVpZ2h0IG90aGVyd2lzZSBNaWNyb3NvZnQgRWRnZSB3aWxsIGNyYXNoLlxyXG4gICAgICAgICAgICAvLyBJdCdzIG9rIGlmIHRoZSBzY3JvbGwgZGF0YSBkaXYgaGVpZ2h0IGRvZXNuJ3QgZXF1YWwgdG8gdGhlIGFjdHVhbCB0b3RhbCBkYXRhIHRhYmxlIGhlaWdodFxyXG4gICAgICAgICAgICAvLyBiZWNhdXNlIGFueXdheSB3ZSB1c2UgdGhlIHJhdGlvIG9mIHNjcm9sbCBkYXRhIGRpdiBoZWlnaHQgdG8gYWN0dWFsIHRvdGFsIGxpc3QgaXRlbSBoZWlnaHRcclxuICAgICAgICAgICAgLy8gdG8gY2FsY3VsYXRlIHRoZSBzY3JvbGxpbmcgcG9zaXRpb24gb2YgdGhlIGFjdHVhbCBkYXRhLlxyXG4gICAgICAgICAgICB0aGlzLmhhc0xvbmdMaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHQgPiB0aGlzLm1heEFjdHVhbFNjcm9sbERhdGFFbGVtZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbmQgYSBoZWlnaHQgbmVhciB0aGUgbWF4QWN0dWFsU2Nyb2xsRGF0YUVsZW1lbnRIZWlnaHQgd2hpY2ggY2FuIGJlIGRpdmlkZWQgZXhhY3RseSBieSB0aGUgcm93IGhlaWdodC5cclxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3aGVuIHdlIGNhbGN1YXRlIHRoZSBzY3JvbGxpbmcgcG9zaXRpb24gb2YgdGhlIGFjdHVhbCBkYXRhLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGZsb2F0aW5nIHBhcnQgb2YgdGhlIGhlaWdodCB3aWxsIGltcGFjdCB0aGUgYWNjdXJhY3kgb2YgdGhlIGNhbGN1bGF0aW9uIHJlc3VsdC5cclxuICAgICAgICAgICAgICAgIHRoaXMuaGFzTG9uZ0xpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcih0aGlzLm1heEFjdHVhbFNjcm9sbERhdGFFbGVtZW50SGVpZ2h0IC8gdGhpcy5yb3dIZWlnaHQpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNvcnRJdGVtcygpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSAmJiB0aGlzLmVkaXRhYmxlQXV0b05ld1Jvdykge1xyXG4gICAgICAgICAgICBjb25zdCByZW5kZXJJdGVtRm9yTmV3RGF0YUl0ZW0gPSA8RGF0YVRhYmxlUmVuZGVyZWRJdGVtPntcclxuICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogPEVkaXRhYmxlRGF0YUl0ZW0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNc2Z0U21lLm5ld0d1aWQoKSxcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQWxlcnRzOiB7fSxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZWRpdGFibGVOZXdEYXRhSXRlbSB8fCB7fSkpLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzTmV3Um93OiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWwsXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0OiBbXVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVySXRlbUZvck5ld0RhdGFJdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQocHJldmVudFNjcm9sbGluZywgZm9yY2VVcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlU2Nyb2xsQWJvdmVEYXRhRWxlbWVudChyZW5kZXJlZEl0ZW1BYm92ZVZpZXdQb3J0TGVuZ3RoPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudCA9IHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBPbmx5IGRpc3BsYXkgdGhlIHNjcm9sbCBhYm92ZSBkYXRhIGVsZW1lbnQgd2hlbiBpdCdzIGhlaWdodCBpcyBhdmFpbGFibGUuXHJcbiAgICAgICAgLy8gSXRzIGhlaWdodCBtYXkgbm90IGJlIHJlYWR5IHdoZW4gdGhlIGRhdGEgdGFibGUgaXMgcmVuZGVyZWQgZmlyc3QgdGltZSBhbmQgdGhlIHNjcm9sbCB0b3AgaXMgMC5cclxuICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCAmJiBzY3JvbGxBYm92ZURhdGFFbGVtZW50Lm9mZnNldEhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSBzY3JvbGxBYm92ZURhdGFFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlZEl0ZW1BYm92ZVZpZXdQb3J0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCA9IHRoaXMucm93SGVpZ2h0ICogcmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFTdHlsZVRvcCA9IHRoaXMuZGlzcGxheUl0ZW1zVG9wIC0gdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICAgICAgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25MYXlvdXRDaGFuZ2VkUmVzcG9uc2l2ZVdpbmRvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLkRhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyLnVwZGF0ZVZpZXdQb3J0V2lkdGhEeW5hbWljYWxseU9uUGhvbmVEb3duKFxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50LCB0aGlzLnJlbmRlcmVyLCB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQsIHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIuY2hlY2tJc1RhYmxlUmVuZGVyZWRPblBob25lRG93bldpdGhNaW5IZWlnaHQoXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyVGFibGVFbGVtZW50LCB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNUYWJsZVJlbmRlcmVkV2l0aE1pbkhlaWdodFBob25lRG93bi5lbWl0KHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNUYWJsZVJlbmRlcmVkV2l0aE1pbkhlaWdodFBob25lRG93bi5lbWl0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlIHRoZSBhY2Nlc3Mgb2YgdGhpcyBmdW5jdGlvbiBvbiBzcGVjaWFsIHNpdHVhdGlvbiB3aGVyZSBkaWFsb2cgY29udGFpbnMgZGF0YS10YWJsZVxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vbldpbmRvd0JyZWFrcG9pbnRDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5kZWZlcnJlZE9uTGF5b3V0Q2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9uIHdpbmRvdyBicmVha3BvaW50IGNoYW5nZWQgaGFuZGxlci5cclxuICAgICAqIEFkZGluZyB5aWVsZCBmb3IgY29tcG9uZW50IHRvIGdldCBFbGVtZW50UmVmIGFmdGVyIGluaXRpYWxpemF0aW9uLlxyXG4gICAgICovXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBvbldpbmRvd0JyZWFrcG9pbnRDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxCb2R5RWxlbWVudCB8fCAhdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50IHx8ICF0aGlzLmhlYWRlclRhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uTGF5b3V0Q2hhbmdlZFJlc3BvbnNpdmVXaW5kb3coKTtcclxuICAgIH1cclxuXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgem9vbVNjYWxlSCA9ICh3aW5kb3cuc2NyZWVuLndpZHRoIC0gd2luZG93LmlubmVyV2lkdGgpIC8gd2luZG93LnNjcmVlbi53aWR0aDtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFdpZHRoID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IE1hdGgubWF4KGN1cnJlbnRXaWR0aCArIHpvb21TY2FsZUggKiBjdXJyZW50V2lkdGgsIGN1cnJlbnRXaWR0aCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFjdHVhbENvbHVtblByb2Nlc3NlZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxBYm92ZURhdGFFbGVtZW50ID0gdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZUhvcml6b250YWwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFzIHRoZSB1c2VyIHpvb21zIGluIGFuZCBvdXQsIHdlIG5lZWQgdG8gZW5hYmxlIGhvcml6b250YWwgc2Nyb2xsaW5nIGluIHRoZVxyXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIFRvIGFjY29tbW9kYXRlIGRpc3BsYXkgb2YgYmlnZ2VyIHpvb21lZCBpbiB0ZXh0LCB3ZSBhbHNvIGFkanVzdCB0aGUgd2lkdGggb2YgdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBpbm5lciB0YWJsZSBjb250YWluZXJcclxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgdGVjaG5pcXVlIHdpbGwgbm90IHdvcmsgZm9yIE1vemlsbGEsIHdob3NlIHZhbHVlIG9mIHdpbmRvdy5pbm5lcldpZHRoIGFuZCB3aW5kb3cuc2NyZWVuLndpZHRoIHJlbWFpbnNcclxuICAgICAgICAgICAgICAgIC8vICAgICAgIGNvbnN0YW50XHJcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBOb3Qgd2luZG93IHJlc3BvbnNpdmUgZGVzaWduXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnb3ZlcmZsb3cteCcsIGBhdXRvYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICBgJHthZGp1c3RlZFdpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLFxyXG4gICAgICAgICAgICAgICAgICAgIGAke2FkanVzdGVkV2lkdGh9cHhgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFdpZHRoID0gdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdlIHN0b3JlIHRoZSBvcmlnaW5hbCByYXRpb3Mgb2YgdGhlIGNvbHVtbiB3aWR0aHMgYXMgcGVyY2VudGFnZXMgb2YgdGhlIG9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi53aWR0aC5lbmRzV2l0aCgnJScpICYmICFjb2x1bW4ud2lkdGhQZXJjZW50YWdlKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbFdpZHRoID0gRGF0YVRhYmxlQ29tcG9uZW50LnB4Q29udmVydGVyLmNvbnZlcnRUb1B4KGNvbHVtbi53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgZ2V0IHJhdGlvcyBmb3IgdW5pdHMgdGhhdCB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IGNvbnZlcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbFdpZHRoICYmICFpc05hTihjb2xXaWR0aCkgJiYgb3JpZ2luYWxXaWR0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgPSBjb2xXaWR0aCAvIG9yaWdpbmFsV2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFRoZSB0ZW1wbGF0ZSBhcHBsaWVzIHRoZSB3aWR0aCByYXRpbyBvZiBlYWNoIGNvbHVtbiBvbiB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ud2lkdGggPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFdoZW4gbGF5b3V0IGlzIGNoYW5nZWQsIHRoZSBcImRpc3BsYXkgYWJvdmUgdmlldyBwb3J0XCIgaXRlbSBsaXN0IGRhdGEgc291cmNlIGlzIHVwZGF0ZWRcclxuICAgICAgICAgICAgLy8gYnV0IHRoZSBodG1sIGlzIG5vdCB1cGRhdGVkIHlldC4gU28gdGhlIFVJIG9mIHRoZSBcImRpc3BsYXkgYWJvdmUgdmlldyBwb3J0XCIgaXMgbm90IGdvb2QuXHJcbiAgICAgICAgICAgIC8vIFNvIGhpZGUgdGhlIFVJIGZvciBub3cgYW5kIGFkanVzdCBpdCBpbiBzZXRUaW1lb3V0LlxyXG4gICAgICAgICAgICBzY3JvbGxBYm92ZURhdGFFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxBYm92ZURhdGFFbGVtZW50KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHByaXZhdGUgZGVmZXJyZWRPbkxheW91dENoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0sIHNlbGVjdGVkOiBib29sZWFuLCBza2lwRXZlbnQ/OiBib29sZWFuLCBza2lwTGlua1NlbGVjdGlvbj86IGJvb2xlYW4sXHJcbiAgICAgICAgaXRlbXNUb1NlbGVjdD86IFRyZWVOb2RlRGF0YUl0ZW1bXSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpdGVtc1RvU2VsZWN0KSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbXNUb1NlbGVjdC5pbmRleE9mKG5vZGUuZGF0YSkgIT09IC0xO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlIHx8XHJcbiAgICAgICAgICAgIChza2lwTGlua1NlbGVjdGlvbiB8fCAhbm9kZS5jaGlsZHJlbiB8fCAhbm9kZS5jaGlsZHJlbi5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5pbmRleE9mKG5vZGUpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogbm9kZS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnNwbGljZSh0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2Yobm9kZSksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2tpcEV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93VW5zZWxlY3RlZC5lbWl0KHsgZGF0YTogbm9kZS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbm9kZS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgaWYgKCFza2lwTGlua1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvdWxkU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW5baV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuc2VsZWN0ZWQgPSBzaG91bGRTZWxlY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCghc2tpcExpbmtTZWxlY3Rpb24gfHwgaXRlbXNUb1NlbGVjdCkgJiYgbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGNoaWxkTm9kZSwgc2VsZWN0ZWQsIHNraXBFdmVudCwgc2tpcExpbmtTZWxlY3Rpb24sIGl0ZW1zVG9TZWxlY3QpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnbkNvbnRlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRyeSB0byBmb2N1cyBvbiByb3cgZnVuY3Rpb247IGlmIHRoZXJlIGFyZSBubyByZWNvcmRzLCB0aGUgbm8gcmVjb3JkcyBtZXNzYWdlIGlzIHNlbGVjdGVkXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggT25seSBwYXNzIGluIGluZGV4IGlmIG5lZWRzIGZvY3VzIG9ubHlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3coaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtcyB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIpO1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJvdzogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChpbmRleCkgJiYgaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYC5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YVtkYXRhLXJlbmRlcmVkLWl0ZW0taW5kZXg9XCIke2luZGV4fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQocm93KSkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YS5zbWUtdGFibGUtcm93LWFjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lclRvcCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBjb250YWluZXJCb3R0b20gPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJDbGllbnRSZWN0ID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXTtcclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lckNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lclRvcCA9IGNvbnRhaW5lckNsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyQm90dG9tID0gY29udGFpbmVyQ2xpZW50UmVjdC5ib3R0b207XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBpc1Jvd0luVmlld1BvcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvd1RvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gcm93LmdldENsaWVudFJlY3RzKClbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAocm93Q2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1RvcCA9IHJvd0NsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlzUm93SW5WaWV3UG9ydCA9IHJvd1RvcCA+PSBjb250YWluZXJUb3AgJiYgcm93VG9wIDwgY29udGFpbmVyQm90dG9tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3cgJiYgIWlzUm93SW5WaWV3UG9ydCAmJiBpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgcm93IGlzIG5vdCBpbiB2aWV3cG9ydCwganVzdCBmb2N1cyB0aGUgZmlyc3QgdmlzaWJsZSByb3cgaW4gdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBkYXRhIHRhYmxlIHdpbGwgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGtleWJvYXJkIGV2ZW50LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFja3VwUm93cyA9IHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXJvdy5zbWUtdGFibGUtcm93LWRhdGEnKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFja3VwUm93cy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gYmFja3VwUm93c1tpXS5nZXRDbGllbnRSZWN0cygpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3dDbGllbnRSZWN0LnRvcCA+IGNvbnRhaW5lclRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBiYWNrdXBSb3dzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA+PSAwICYmICF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IDxIVE1MRWxlbWVudD5yb3cucXVlcnlTZWxlY3RvckFsbCgnLnNtZS10YWJsZS10ZCcpW3RoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50XTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50ID0gRG9tLmdldEZpcnN0Rm9jdXNhYmxlRGVzY2VuZGVudChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWRpdGFibGUgZGF0YSB0YWJsZSwgYmVjYXVzZSBvZiB0aGUgZGVzaWduXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGZvY3VzIG9uIHRoZSByb3cgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkVsZW1lbnRGb2N1c2luZyhldmVudDogRWxlbWVudEZvY3VzaW5nRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Wm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEZvY3VzQmVoYXZpb3IoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50JylcclxuICAgICAgICAgICAgJiYgZXZlbnQudGFyZ2V0RWxlbWVudCA9PT0gdGhpcy5sYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Rm9jdXNCZWhhdmlvcigpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZVpvbmUgPT09IHRoaXMuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudCB8fCBldmVudC5zb3VyY2Vab25lID09PSB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEZvY3VzYWJsZUVsZW1lbnQgPSBEb20uZ2V0TmV4dFpvbmVFbGVtZW50KGV2ZW50LnRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0Rm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHRFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFRhcmdldFpvbmUgPSBEb20uZ2V0QW5jZXN0b3Jab25lKG5leHRGb2N1c2FibGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBDb3JlRW52aXJvbm1lbnQuYWNjZXNzaWJpbGl0eU1hbmFnZXIucHJvY2Vzc0VsZW1lbnRGb2N1c2luZyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQubmF0aXZlRXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRGb2N1c2FibGVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXRab25lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUYXJnZXRab25lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIudmVyaWZ5RGF0YVRhYmxlQ29sdW1uc1Zpb2xhdGlvbihldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0NvbHVtbnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzQWN0dWFsQ29sdW1ucygpO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ29sdW1uc01haW4oKSB7XHJcbiAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1jb2xjb3VudCcsXHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5sZW5ndGggKyAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUgPyAxIDogMCkpO1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5Qcm9jZXNzZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0FjdHVhbENvbHVtbnMoKSB7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChzb3VyY2VDb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNvbHVtbiAhPT0gdGhpcy5ncm91cENvbHVtbiAmJiAhc291cmNlQ29sdW1uLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5wdXNoKHNvdXJjZUNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzc0NvbHVtbnNCeU9yZGVyKG9yZGVyOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zT3JkZXIgPSBvcmRlcjtcclxuICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgIG9yZGVyLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLmZpZWxkID09PSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNvbHVtbiAmJiBzb3VyY2VDb2x1bW4gIT09IHRoaXMuZ3JvdXBDb2x1bW4gJiYgIXNvdXJjZUNvbHVtbi5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMucHVzaChzb3VyY2VDb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9yZGVyICYmIG9yZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1uc01haW4oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2YgZmlsdGVyZWQgaXRlbXMgKGlmIGFueSkgd2l0aGluIHRoZSBkYXRhVGFibGUuXHJcbiAgICAgKiBAcmV0dXJucyBudW1iZXIgb2YgZGF0YVRhYmxlIGZpbHRlcmVkIGl0ZW1zLCB6ZXJvIGlmIG5vbmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXROdW1iZXJPZkZpbHRlcmVkSXRlbXMoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEl0ZW1zID8gdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHRvb2x0aXAgaGFuZGxlciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBkYXRhIHRhYmxlIGNvbHVtbi5cclxuICAgICAqIEBwYXJhbSBjb2x1bW4gICAgICAgIENvbHVtbiBmb3IgdG9vbHRpcCBoYW5kbGVyXHJcbiAgICAgKiBAcGFyYW0gcmVuZGVyZWRJdGVtICBEYXRhIGl0ZW0gZm9yIHRoZSByb3dcclxuICAgICAqIEByZXR1cm5zICAgICAgICAgICAgIFRvb2x0aXAgc3RyaW5nIGlmIGV4aXN0cy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCEhY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIocmVuZGVyZWRJdGVtLmRhdGEsIGNvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmVuYWJsZURlZmF1bHRUb29sdGlwcyAmJiAhTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChjb2x1bW4uZmllbGQpKVxyXG4gICAgICAgICAgICAgICAgPyBjb2x1bW4uZ2V0RGVmYXVsdFRvb2x0aXBIYW5kbGVyKHJlbmRlcmVkSXRlbS5kYXRhLCBjb2x1bW4uZmllbGQpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgZnJvbSB1cGdyYWRpbmcgZGF0YSB0YWJsZSB0byBzdXBwb3J0IGVkaXRhYmxlIGRhdGEgdGFibGVcclxuICAgICAqIFRoZSBpZGVhIGlzIHRvIHVzZSB0aGUgZGF0YSB0YWJsZSdzIGhlYWRlciB3aWR0aCB0byBiZSBhcHBsaWVkIG9uIHRoZSBkYXRhIHRhYmxlIGJvZHkgY29sdW1ucy5cclxuICAgICAqIFdoZW4gbm90IHNob3dpbmcgaGVhZGVycywgbmVlZCB0byB1c2UgdGhlIGhlYWRlcidzIHdpZHRoIHRvIGJlIGFwcGxpZWQgdG8gdGQgYXMgd2VsbC5cclxuICAgICAqL1xyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRoRWxlbWVudHMgPSB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLWNhcHRpb24uc21lLXRhYmxlLWNvbHVtbi1oZWFkZXInKTtcclxuICAgICAgICBpZiAodGhFbGVtZW50cyAmJiB0aEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFjdHVhbENvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uc1tpXS5kb21XaWR0aCA9IHRoRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRJc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgb25lIG1vcmUgdGljayBzbyB0aGF0IHRoZSBsb2FkaW5nIHdoZWVsIGNhbiBzdGFuZCBvbmUgbW9yZSBodG1sIHJlbmRlcmluZyBsaWZlIGN5Y2xlXHJcbiAgICAgKiBUaGlzIGZpeGVzIGEgYnVnIHJlbGF0ZWQgdG8gZGF0YSB0YWJsZSBvbiBsb2FkIG1pcy1hbGlnbmVkXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgYm9vbGVhblxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHJpdmF0ZSBzZXRJc0NvbHVtbldpZHRoQ2FsY3VsYXRlZChpbnB1dDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgPSBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEuY29udGVudCA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEgPT09IHRoaXMuc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRyZWVOb2RlRGF0YUlkZW50aXR5KG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oY3VycmVudE5vZGUuZGF0YSkgKyAnXFxcXCcgKyByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdEFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMucmVuZGVyZWRJdGVtcy5zbGljZSgpLm1hcChpdGVtID0+IGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlRdWVyeUVkaXRvcih2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxRdWVyeUVkaXRvciA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxdWVyeUVkaXRvckZpbHRlck1haW4odmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0OiBRdWVyeURhdGEsIGl0ZW06IERhdGFUYWJsZURhdGFJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBxdWVyeUVkaXRvckl0ZW0gPSB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHNbaV07XHJcbiAgICAgICAgICAgIGlmIChmb3VuZCAmJiB0aGlzLmFjdHVhbENvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gcXVlcnlFZGl0b3JJdGVtLmNvbHVtbi52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuYWN0dWFsQ29sdW1ucy5maWx0ZXIoKGNvbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2wuZmllbGQgPT09IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgfSlbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChpdGVtLCBjb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbih2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhc2VTZW5zaXRpdmVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEZsb2F0VmFsID0gcGFyc2VGbG9hdChxdWVyeUVkaXRvckl0ZW0udmFsdWUudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxGbG9hdFZhbCA9IHBhcnNlRmxvYXQodmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFN0cmluZ1ZhbCA9IHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS52YWx1ZS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFN0cmluZ1ZhbCA9IHZhbHVlLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5RWRpdG9ySXRlbSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLlNpbmdsZURyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcXVlcnlFZGl0b3JJdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuVGV4dElucHV0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChxdWVyeUVkaXRvckl0ZW0ub3BlcmFuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlEYXRhT3BlcmFuZC5FcTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5xdWVyeUVkaXRvckVxdWFsSXNDb250YWluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU3RyaW5nVmFsLmluZGV4T2YodGFyZ2V0U3RyaW5nVmFsKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmlsdGVyIHN0cmluZyBpcyBlbXB0eSB0aGVuIHRyZWF0IGFzICdFcXVhbElzQ29udGFpbicgdG8gcmVmcmVzaCBkYXRhIHRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU3RyaW5nVmFsICE9PSB0YXJnZXRTdHJpbmdWYWwgJiYgIU1zZnRTbWUuaXNFbXB0eSh0YXJnZXRTdHJpbmdWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5RGF0YU9wZXJhbmQuR3Q6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0RmxvYXRWYWwgfHwgdGFyZ2V0RmxvYXRWYWwgPT09IDApICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0dWFsRmxvYXRWYWwgfHwgYWN0dWFsRmxvYXRWYWwgPT09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YXJnZXRGbG9hdFZhbCA8PSBhY3R1YWxGbG9hdFZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlEYXRhT3BlcmFuZC5MdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0YXJnZXRGbG9hdFZhbCB8fCB0YXJnZXRGbG9hdFZhbCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChhY3R1YWxGbG9hdFZhbCB8fCBhY3R1YWxGbG9hdFZhbCA9PT0gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhcmdldEZsb2F0VmFsID49IGFjdHVhbEZsb2F0VmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRdWVyeURhdGFPcGVyYW5kLk5xOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhY3R1YWxTdHJpbmdWYWwgIT09IHRhcmdldFN0cmluZ1ZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBlcVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU3RyaW5nVmFsLmluZGV4T2YodGFyZ2V0U3RyaW5nVmFsKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVlcnlFZGl0b3JJdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuTXVsdGlTZWxlY3REcm9wZG93bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnF1ZXJ5RWRpdG9yRmlsdGVyQnlNdWx0aXBsZVNlbGVjdGlvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LCBxdWVyeUVkaXRvckl0ZW0sIGFjdHVhbFN0cmluZ1ZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVlcnlFZGl0b3JJdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuVGltZXNwYW5Ecm9wZG93bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnF1ZXJ5RWRpdG9yRmlsdGVyQnlUaW1lc3BhbkRyb3Bkb3duKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QsIHF1ZXJ5RWRpdG9ySXRlbSwgYWN0dWFsU3RyaW5nVmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHF1ZXJ5RWRpdG9yRmlsdGVyQnlUaW1lc3BhbkRyb3Bkb3duKFxyXG4gICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDogUXVlcnlEYXRhLCBxdWVyeUVkaXRvckl0ZW06IFF1ZXJ5RGF0YUl0ZW0sIGFjdHVhbFN0cmluZ1ZhbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSBxdWVyeUVkaXRvckl0ZW0uY29sdW1uLnZhbHVlO1xyXG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcclxuICAgICAgICBsb29wMTpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuVGltZXNwYW5Ecm9wZG93biAmJiBpdGVtLmNvbHVtbiAmJiBpdGVtLmNvbHVtbi52YWx1ZSA9PT0gZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlLnZhbHVlICYmIGl0ZW0udmFsdWUudmFsdWUuc3RhcnQgJiYgaXRlbS52YWx1ZS52YWx1ZS5lbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGl0ZW0udmFsdWUudmFsdWUuc3RhcnQuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IGl0ZW0udmFsdWUudmFsdWUuZW5kLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWwgPSBuZXcgRGF0ZShhY3R1YWxTdHJpbmdWYWwpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPD0gYWN0dWFsICYmIGFjdHVhbCA8PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxdWVyeUVkaXRvckZpbHRlckJ5TXVsdGlwbGVTZWxlY3Rpb24oXHJcbiAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0OiBRdWVyeURhdGEsIHF1ZXJ5RWRpdG9ySXRlbTogUXVlcnlEYXRhSXRlbSwgYWN0dWFsU3RyaW5nVmFsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSBxdWVyeUVkaXRvckl0ZW0uY29sdW1uLnZhbHVlO1xyXG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcclxuICAgICAgICBsb29wMTpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuTXVsdGlTZWxlY3REcm9wZG93biAmJiBpdGVtLmNvbHVtbiAmJiBpdGVtLmNvbHVtbi52YWx1ZSA9PT0gZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaXRlbS52YWx1ZS52YWx1ZS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFN0cmluZ1ZhbCA9IGl0ZW0udmFsdWUudmFsdWVbal0udG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTdHJpbmdWYWwgPT09IHRhcmdldFN0cmluZ1ZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoYW5kbGVyIGZvciBjb2xsYXBzaW5nLCBjaGVja2luZyBpZiBub2RlMSBjb250YWlucyBub2RlMi5cclxuICAgICAqIEBwYXJhbSBub2RlMSB0aGUgbm9kZSBhcyByb290IHRvIGNoZWNrIGlmIGl0IGNvbnRhaW5zIG5vZGUyLlxyXG4gICAgICogQHBhcmFtIG5vZGUyIHRoZSBub2RlIHRvIGJlIGNoZWNrZWQgaWYgY2hpbGRyZW4gb2Ygbm9kZTEuXHJcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vZGUxIGNvbnRhaW5zIG5vZGUyLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyZWVUYWJsZUNvbGxhcHNlSGFuZGxlcihub2RlMTogYW55LCBub2RlMjogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFub2RlMSB8fCAhbm9kZTIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXJlbnQgbm9kZSwgaXQgY2FuIGJlIHdpdGhvdXQgaWQuXHJcbiAgICAgICAgaWYgKG5vZGUxLmRhdGE/LmlkID09PSBub2RlMi5kYXRhPy5pZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChub2RlMT8uY2hpbGRyZW4gJiYgbm9kZTEuY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZTEuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyZWVUYWJsZUNvbGxhcHNlSGFuZGxlcihjaGlsZCwgbm9kZTIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlSWRCYWcoKTogTXNmdFNtZS5TdHJpbmdNYXA8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmlyc3REYXRhQ29sdW1uOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0aGUgdHJlZSBncmlkIGFjY2Vzc2liaWxpdHkgZG9jdW1lbnRhdGlvbnM6IGh0dHBzOi8vd2lraS5tb3ppbGxhLm9yZy9BY2Nlc3NpYmlsaXR5L1RyZWVHcmlkXHJcbiAqL1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS10cmVlLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJlZVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgRGF0YVRhYmxlQ29tcG9uZW50IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnVHJlZVRhYmxlQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd0FzVHJlZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEluaXRpYWxIb3N0Q2xhc3NlcygpIHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkuY29uY2F0KFtcclxuICAgICAgICAgICAgJ3NtZS10cmVlLXRhYmxlJ1xyXG4gICAgICAgIF0pO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwic21lLXRhYmxlLWhlYWRlciBzbWUtZm9jdXMtem9uZSBzbWUtZGF0YS10YWJsZS10cmFuc2l0aW9uXCIgI2hlYWRlclxyXG4gIFtjbGFzcy5zbWUtc2hhZG93LXNjcm9sbGVkLWNvbnRlbnRdPVwiaXNTY3JvbGxlZERvd25cIiBbY2xhc3Muc21lLXRhYmxlLW11bHRpLXNlbGVjdF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJ1wiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1zZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIiBbY2xhc3Muc21lLXRhYmxlLWluZGVudGVkXT1cIiFub0xlZnRNYXJnaW5cIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0LWFsbC1lbmFibGVkXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnICYmIHNob3dBbGxJdGVtQ2hlY2tib3hcIj5cclxuICA8IS0tIEFjY29yZGluZyB0byB0aGUgYWNjZXNzaWJpbGl0eSB0ZWFtLCBkYXRhLXRhYmxlIGhlYWRlcnMgc2hvdWxkIGJlIGFjY2Vzc2libGUgYnkga2V5Ym9hcmRcclxuICBhbmQgdGhlIHJlc2l6ZXIgc2hvdWxkIGFsc28gYmUgYWNjZXNzZWQgYnkga2V5Ym9hcmQuLS0+XHJcbiAgPGRpdiAjaGVhZGVyVGFibGUgY2xhc3M9XCJzbWUtdGFibGUgc21lLXRhYmxlLXZpcnR1YWxpemVkIHNtZS10YWJsZS1hdXRvLXdpZHRoLXBob25lLWRvd25cIiByb2xlPVwicm93Z3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS1hcnJhbmdlLXN0YWNrLWggc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiIHJvbGU9XCJyb3dcIlxyXG4gICAgICAoa2V5ZG93bik9XCJvbkhlYWRlclRhYmxlUHJlc3NlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2FwdGlvblwiIFthdHRyLnJvbGVdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZSc/J2NvbHVtbmhlYWRlcic6J3ByZXNlbnRhdGlvbidcIlxyXG4gICAgICAgIGRhdGEtdXRhLWlkPVwiY2hlY2tib3hDb2x1bW5cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94IHNtZS10YWJsZS1oZWFkZXItY2hlY2tib3hcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiBzaG93QWxsSXRlbUNoZWNrYm94ICYmIHNob3dIZWFkZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICA8aW5wdXQgc21lLWxpbnQtZGlzYWJsZS1zZWxmIHR5cGU9XCJjaGVja2JveFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0QWxsSXRlbUNoZWNrQm94QXJpYUxhYmVsKClcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaG91bGRBbGxJdGVtQ2hlY2tCb3hDaGVja2VkKClcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwic2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpPyd0cnVlJzonZmFsc2UnXCIgKGNoYW5nZSk9XCJvbkFsbEl0ZW1DaGVja0JveENsaWNrZWQoKVwiIC8+XHJcbiAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgYWN0dWFsQ29sdW1uczsgbGV0IGNvbEluZGV4ID0gaW5kZXhcIiBbYXR0ci5maWVsZF09XCJjb2x1bW4uZmllbGRcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2x1bW4ud2lkdGh9XCJcclxuICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jYXB0aW9uIHNtZS10YWJsZS1jb2x1bW4taGVhZGVyIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG8ge3tjb2x1bW4uc3R5bGVDbGFzc319XCJcclxuICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCIgW2F0dHIuZGF0YS11dGEtaWRdPVwiY29sdW1uLnV0YUlkXCIgW2F0dHIuY29sdW1uLWluZGV4XT1cImNvbEluZGV4XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydGFibGUhPSdmYWxzZScgJiYgc2hvd0hlYWRlclwiXHJcbiAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbCBzbWUtZm9jdXMtem9uZVwiIChjbGljayk9XCJjbGlja0NvbHVtbihjb2x1bW4pXCIgcm9sZT1cImNvbHVtbmhlYWRlclwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHRhYmluZGV4PVwiMFwiIFthdHRyLmFyaWEtc29ydF09XCJjb2x1bW5Tb3J0U2V0dGluZ3NbY29sdW1uLmhlYWRlcl1cIj5cclxuICAgICAgICAgIDxzcGFuPnt7Y29sdW1uLmhlYWRlcn19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtbWFyZ2luLWxlZnQteHhzXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJjb2x1bW4uc29ydGFibGUgPyBnZXRTb3J0TGFiZWwoY29sdW1uKSA6IG51bGxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLXVwJzpjb2x1bW4uc29ydE1vZGU9PT1zb3J0TW9kZUVudW0uQXNjZW5kLCdzbWUtaWNvbi1kb3duJzpjb2x1bW4uc29ydE1vZGU9PT1zb3J0TW9kZUVudW0uRGVzY2VuZH1cIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiEoY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSE9J2ZhbHNlJykgJiYgc2hvd0hlYWRlclwiIGNsYXNzPVwic21lLXRhYmxlLWhlYWRlci1jZWxsIHNtZS1mb2N1cy16b25lXCJcclxuICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgPHNwYW4+e3tjb2x1bW4uaGVhZGVyfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1tYXJnaW4tbGVmdC14eHNcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbHVtbi5zb3J0YWJsZSA/IGdldFNvcnRMYWJlbChjb2x1bW4pIDogbnVsbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tdXAnOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5Bc2NlbmQsJ3NtZS1pY29uLWRvd24nOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5EZXNjZW5kfVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dIZWFkZXJcIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbFwiIHJvbGU9XCJjb2x1bW5oZWFkZXJcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c21lLXJlc2l6ZXIgW2ZvY3VzYWJsZV09XCJmYWxzZVwiICpuZ0lmPVwiY29sSW5kZXghPT1hY3R1YWxDb2x1bW5zLmxlbmd0aC0xICYmIHNob3dIZWFkZXJcIlxyXG4gICAgICAgICAgcmVzaXplckhvc3RTZWxlY3Rvcj1cImRpdi5zbWUtdGFibGUtaGVhZGVyXCIgKHJlc2l6ZWQpPVwib25Db2x1bW5SZXNpemVkKGNvbEluZGV4LCAkZXZlbnQpXCJcclxuICAgICAgICAgIFt2aXNpYmxlVG9TY3JlZW5SZWFkZXJdPVwidHJ1ZVwiIFtzaG93UmVzaXplckNvdmVyXT1cImZhbHNlXCIgb3JpZW50YXRpb249XCJsZWZ0XCJcclxuICAgICAgICAgIChyZXNpemluZyk9XCJvbkNvbHVtblJlc2l6aW5nKCRldmVudClcIiBjbGFzcz1cInNtZS1mb2N1cy16b25lXCI+PC9zbWUtcmVzaXplcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJzbWUtZm9jdXMtem9uZSBzbWUtdGFibGUtY29udGFpbmVyIHNtZS1kYXRhLXRhYmxlLXRyYW5zaXRpb25cIiAjY29udGVudCByb2xlPVwicHJlc2VudGF0aW9uXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLW11bHRpLXNlbGVjdF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJ1wiIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCJcclxuICBbY2xhc3Muc21lLW1hcmdpbi10b3Atbm9uZV09XCIhc2hvd0hlYWRlclwiIFtjbGFzcy5zbWUtdGFibGUtaW5kZW50ZWRdPVwiIW5vTGVmdE1hcmdpblwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1ncmlkLWxpbmVzXT1cInNob3dHcmlkXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLXNlbGVjdC1hbGwtZW5hYmxlZF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiBzaG93QWxsSXRlbUNoZWNrYm94XCJcclxuICBbY2xhc3Muc21lLXRhYmxlLWVkaXRhYmxlXT1cImVkaXRhYmxlXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1zY3JvbGwtY29udGFpbmVyIHNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLWluc2V0LW5vbmVcIlxyXG4gICAgW25nQ2xhc3NdPVwieydzbWUtbGF5b3V0LWFic29sdXRlIHNtZS1wb3NpdGlvbi1pbnNldC1ub25lJzogc2Nyb2xsYWJsZSwgJ3NtZS1zY3JvbGxhYmxlJzogc2hvdWxkU2Nyb2xsfVwiXHJcbiAgICAjc2Nyb2xsQ29udGFpbmVyIHJvbGU9XCJyb3dncm91cFwiPlxyXG4gICAgPGRpdiByb2xlPVwicm93XCIgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS10YWJsZS1yb3ctcGxhY2Vob2xkZXJcIiAjZW1wdHlNZXNzYWdlIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICpuZ0lmPVwic2hvd05vUmVjb3Jkc01lc3NhZ2UoKVwiIGRhdGEtdXRhLWlkPVwiZW1wdHktdGFibGUtbWVzc2FnZVwiPlxyXG4gICAgICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJpc0xvYWRpbmcgfHwgIWlzQ29sdW1uV2lkdGhDYWxjdWxhdGVkXCIgW21lc3NhZ2VdPVwibG9hZGluZ01lc3NhZ2VcIj5cclxuICAgICAgPC9zbWUtbG9hZGluZy13aGVlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jZWxsLXBsYWNlaG9sZGVyXCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgIDxkaXYgcm9sZT1cImdyaWRjZWxsXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiPnt7Z2V0Tm9SZWNvcmRzTWVzc2FnZSgpfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtcmVsYXRpdmUgc21lLXBvc2l0aW9uLXN0cmV0Y2gtaCBzbWUtYXJyYW5nZS1vdmVyZmxvdy1oaWRlXCIgI3Njcm9sbEJvZHkgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlIHNtZS10YWJsZS1zY3JvbGxhYmxlIHNtZS10YWJsZS12aXJ0dWFsaXplZFwiICNzY3JvbGxBYm92ZURhdGFcclxuICAgICAgICBbbmdTdHlsZV09XCJ7dG9wOiBzY3JvbGxBYm92ZURhdGFTdHlsZVRvcH1cIiBbYXR0ci5hcmlhLWhpZGRlbl09XCJ0cnVlXCIgc21lLWxpbnQtZGlzYWJsZT5cclxuICAgICAgICA8IS0tIEFib3ZlIHZpZXcgcG9ydCAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByZW5kZXJlZEl0ZW0gb2YgcmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQ7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLXJvdyBzbWUtdGFibGUtcm93LWRhdGEgc21lLXRhYmxlLXJvdy1zZWxlY3RhYmxlXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LWFjdGl2ZV09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPT09IGdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KClcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1yb3ctc2VsZWN0ZWRdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIHx8IGlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1pdGVtXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1oZWFkZXJdPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0FzVHJlZVwiIGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGFjdHVhbENvbHVtbnM7IGxldCBjb2xJbmRleD1pbmRleFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtdGFibGUtY29sdW1uLWZpcnN0JzogaXNGaXJzdERhdGFDb2x1bW4oY29sdW1uKSwgJ3NtZS10YWJsZS1ncm91cC1oZWFkZXItY2VsbCc6IHJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJ9XCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzpjb2x1bW4uZG9tV2lkdGgrJ3B4J31cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG8ge3tjb2x1bW4uc3R5bGVDbGFzc319XCJcclxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc1RyZWVUYWJsZVBhcmVudE5vZGUocmVuZGVyZWRJdGVtKSA/IC0xIDogMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlciBzbWUtc2NyZWVuLXJlYWRlci1kaXNhYmxlLWNvcHlcIiAqbmdJZj1cImlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgIHt7Z2V0QWRkaXRpb25hbFNjcmVlblJlY29yZGVyQ29udGVudChyZW5kZXJlZEl0ZW0pfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiBjb2xJbmRleD09PTBcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0dyb3VwVG9nZ2xlKHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlR3JvdXBUb2dnbGVcIiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzIHNtZS1tYXJnaW4tcmlnaHQteHhzXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6aXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKSwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IWlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSl9XCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YX19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyIFt0ZW1wbGF0ZV09XCJ0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWV4cGFuZGFibGUnOiByZW5kZXJlZEl0ZW0uaGFzQ2hpbGRyZW4gJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzTGVhZn1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHNcIiByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZD8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja1RyZWVUb2dnbGUoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6cmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQsICdzbWUtaWNvbi1jaGV2cm9uUmlnaHQnOiFyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZH1cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmNvbGxhcHNlIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmV4cGFuZFwiPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiByZW5kZXJlZEl0ZW0ubm9kZS5pc0J1c3kgJiYgY29sSW5kZXg9PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGxcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6KHJlbmRlcmVkSXRlbS5kZXB0aCoxNis0KSsncHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNtZS1sb2FkaW5nLXdoZWVsIHNpemU9XCJleHRyYS1zbWFsbFwiIFtpbmxpbmVdPVwidHJ1ZVwiIFtpc0JhY2tncm91bmRUcmFuc3BhcmVudF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dBc1RyZWUgJiYgc2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgcmVuZGVyZWRJdGVtLnR5cGU9PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIGNvbEluZGV4PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSXRlbUNoZWNrQm94Q2xpY2tlZChyZW5kZXJlZEl0ZW0pXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhP3Jlc29sdmVPYmplY3RQYXRoKHJlbmRlcmVkSXRlbS5kYXRhLGNvbHVtbi5maWVsZCk6Jy4nfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtaGVpZ2h0LWF1dG9dPVwiYXV0b1Jvd0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5VGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZSBzbWUtdGFibGUtc2Nyb2xsYWJsZVwiICNzY3JvbGxEYXRhIFtjbGFzcy5zbWUtdGFibGUtdmlydHVhbGl6ZWRdPVwiIWRpc2FibGVVSVZpcnR1YWxpemF0aW9uXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7dG9wOiBzY3JvbGxEYXRhU3R5bGVUb3B9XCIgc21lLWxpbnQtZGlzYWJsZSByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmVuZGVyZWRJdGVtIG9mIHJlbmRlcmVkSXRlbXNJbkFuZEJlbG93Vmlld1BvcnQ7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgIChrZXlkb3duKT1cIm9uQ29udGVudFRhYmxlUHJlc3NlZCgkZXZlbnQpXCIgKGtleXVwKT1cIm9uQ29udGVudFRhYmxlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoY29udGV4dG1lbnUpPVwiZW5hYmxlUmlnaHRDbGlja1NlbGVjdCA/IHNlbGVjdEl0ZW0oJGV2ZW50LCByZW5kZXJlZEl0ZW0pIDogdHJ1ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SXRlbSgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIiBjbGFzcz1cInNtZS10YWJsZS1yb3cgc21lLXRhYmxlLXJvdy1kYXRhIHNtZS10YWJsZS1yb3ctc2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLXJvdy1hY3RpdmVdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LXNlbGVjdGVkXT1cInJvd0Rpc3BsYXlBc1NlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1pdGVtXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1oZWFkZXJdPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCIgW2NsYXNzLnNtZS10YWJsZS1yb3ctZWRpdGFibGVdPVwiZWRpdGFibGVcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS1oYXMtdmFsaWRhdGlvbi1lcnJvcl09XCJoYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLWRhdGEtdGFibGUtcm93LW5ldy1pdGVtXT1cInJlbmRlcmVkSXRlbT8uZGF0YT8uaXNOZXdSb3dcIlxyXG4gICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwicmVuZGVyZWRJdGVtLmluZGV4ID49IDAgPyAwIDogdW5kZWZpbmVkXCIgKGRibGNsaWNrKT1cImRvdWJsZUNsaWNrUm93KCRldmVudCxyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIChmb2N1cyk9XCJvbkNvbnRlbnRJdGVtRm9jdXNlZCgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIiAoZm9jdXNpbik9XCJvbkNvbnRlbnRJdGVtRm9jdXNlZCgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uQ29udGVudEl0ZW1CbHVycmVkKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiIFthdHRyLmRhdGEtcmVuZGVyZWQtaXRlbS1pbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXhcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXgrMlwiIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKT8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRIb3ZlcmVkUmVuZGVyZWRJdGVtKHJlbmRlcmVkSXRlbSlcIiAobW91c2VsZWF2ZSk9XCJ1bnNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJnZXRBcmlhRXhwYW5kZWRBdHRyaWJ1dGVWYWx1ZShyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGV2ZWxdPVwic2hvd0FzVHJlZSAmJiByZW5kZXJlZEl0ZW0uZGVwdGggPyAocmVuZGVyZWRJdGVtLmRlcHRoKzEpOnVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLWhcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIucm9sZV0gPSBcInNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScgPyAnZ3JpZGNlbGwnOiAncHJlc2VudGF0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0FzVHJlZVwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKT8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmZpcnN0RGF0YUNvbHVtbiArIHJlbmRlcmVkSXRlbS5pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIChjaGFuZ2UpPVwib25JdGVtQ2hlY2tCb3hDbGlja2VkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBhY3R1YWxDb2x1bW5zOyBsZXQgY29sSW5kZXg9aW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLXRhYmxlLWNvbHVtbi1maXJzdCc6IGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbiksICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyLWNlbGwnOiByZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyfVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6Y29sdW1uLmRvbVdpZHRoKydweCd9XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvIHt7Y29sdW1uLnN0eWxlQ2xhc3N9fVwiXHJcbiAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXgrMlwiXHJcbiAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXNUcmVlVGFibGVQYXJlbnROb2RlKHJlbmRlcmVkSXRlbSkgPyAtMSA6IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXNjcmVlbi1yZWFkZXIgc21lLXNjcmVlbi1yZWFkZXItZGlzYWJsZS1jb3B5XCIgKm5nSWY9XCJpc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pXCI+XHJcbiAgICAgICAgICAgICAgICB7e2dldEFkZGl0aW9uYWxTY3JlZW5SZWNvcmRlckNvbnRlbnQocmVuZGVyZWRJdGVtKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgY29sSW5kZXg9PT0wXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tHcm91cFRvZ2dsZShyZW5kZXJlZEl0ZW0pXCIgW2lkXT1cImdldEZpcnN0Q29sdW1uSWQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZUdyb3VwVG9nZ2xlXCIgY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zaXplLXh4cyBzbWUtbWFyZ2luLXJpZ2h0LXh4c1wiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tY2hldnJvbkRvd24nOmlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSksICdzbWUtaWNvbi1jaGV2cm9uUmlnaHQnOiFpc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGF9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciBbdGVtcGxhdGVdPVwidGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0J1c3kgJiYgY29sSW5kZXg9PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGxcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6KHJlbmRlcmVkSXRlbS5kZXB0aCoxNis0KSsncHgnfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1leHBhbmRhYmxlJzogcmVuZGVyZWRJdGVtLmhhc0NoaWxkcmVuICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0xlYWZ9XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzXCIgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQ/J3RydWUnOidmYWxzZSdcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tUcmVlVG9nZ2xlKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tY2hldnJvbkRvd24nOnJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkLCAnc21lLWljb24tY2hldnJvblJpZ2h0JzohcmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWR9XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5jb2xsYXBzZSA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5leHBhbmRcIj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGwtcGxhY2Vob2xkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgcmVuZGVyZWRJdGVtLm5vZGUuaXNCdXN5ICYmIGNvbEluZGV4PT09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOihyZW5kZXJlZEl0ZW0uZGVwdGgqMTYrNCkrJ3B4J31cIj5cclxuICAgICAgICAgICAgICAgIDxzbWUtbG9hZGluZy13aGVlbCBzaXplPVwiZXh0cmEtc21hbGxcIiBbaW5saW5lXT1cInRydWVcIiBbaXNCYWNrZ3JvdW5kVHJhbnNwYXJlbnRdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9zbWUtbG9hZGluZy13aGVlbD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGwtcGxhY2Vob2xkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93QXNUcmVlICYmIHNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnICYmIHJlbmRlcmVkSXRlbS50eXBlPT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiBjb2xJbmRleD09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jaGVja2JveC1jb250YWluZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSk/J3RydWUnOidmYWxzZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIiAoY2hhbmdlKT1cIm9uSXRlbUNoZWNrQm94Q2xpY2tlZChyZW5kZXJlZEl0ZW0pXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCJnZXRGaXJzdENvbHVtbklkKGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YT9yZXNvbHZlT2JqZWN0UGF0aChyZW5kZXJlZEl0ZW0uZGF0YSxjb2x1bW4uZmllbGQpOicuJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCIgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWhlaWdodC1hdXRvXT1cImF1dG9Sb3dIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiIFtpZF09XCJnZXRGaXJzdENvbHVtbklkKGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5VGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiAhY29sdW1uLmJvZHlFZGl0VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmJvZHlSZWFkVGVtcGxhdGUgJiYgcmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YT9yZXNvbHZlT2JqZWN0UGF0aChyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50LGNvbHVtbi5maWVsZCk6Jy4nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgcmVuZGVyZWRJdGVtLmRhdGEgJiYgY29sdW1uLmJvZHlSZWFkVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCIgW3JlbmRlcmVkSXRlbV09XCJyZW5kZXJlZEl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnRcIiBbcm93SW5kZXhdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgY29sdW1uLmJvZHlFZGl0VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvdWxkU2hvd0VkaXRSb3cocmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCxjb2x1bW4uZmllbGQpOicuJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGEuY29udGVudFwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3VsZFNob3dFZGl0Um93KHJlbmRlcmVkSXRlbSlcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1lZGl0LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5RWRpdFRlbXBsYXRlXCIgW2ZpZWxkXT1cImNvbHVtbi5maWVsZFwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleFwiIFtyZW5kZXJlZEl0ZW1dPVwicmVuZGVyZWRJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsaWRhdGlvbkFsZXJ0KT1cIm9uVmFsaWRhdGlvbkFsZXJ0SGFuZGxlcihyZW5kZXJlZEl0ZW0sIGNvbHVtbi5maWVsZCwgJGV2ZW50LmFsZXJ0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGRhdGFDaGFuZ2VkKT1cIm9uRWRpdGFibGVEYXRhQ2hhbmdlZCgkZXZlbnQucmVuZGVyZWRJdGVtLCRldmVudC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtKVwiIGNsYXNzPVwic21lLXRhYmxlLXJvdy12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIucm9sZV0gPSBcInNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScgPyAnZ3JpZGNlbGwnIDogJ3ByZXNlbnRhdGlvbidcIlxyXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnPycwJzondW5kZWZpbmVkJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhbGlkYXRpb25SZXN1bHRJdGVtIG9mIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtdmFsaWRhdGlvbi1hbGVydCBbYWxlcnRdPVwidmFsaWRhdGlvblJlc3VsdEl0ZW0uYWxlcnRcIj48L3NtZS12YWxpZGF0aW9uLWFsZXJ0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1yb3dcIiAjdGVtcFJvdz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGRcIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJzaG91bGRVc2VMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudFwiICNsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCBjbGFzcz1cInNtZS1mb2N1cy16b25lXCJcclxuICAgICAgZGF0YS1zbWUtbGFzdC1mb2N1c2FibGUtc2hhZG93LWVsZW1lbnQgKGZvY3VzKT1cIm9uTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c2VkKCRldmVudClcIiB0YWJpbmRleD1cIjBcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24taW5zZXQtbm9uZVwiXHJcbiAgICAqbmdJZj1cImlzQnVzeSB8fCAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nKVwiPlxyXG4gICAgPHNtZS1sb2FkaW5nLXdoZWVsIFtpc0JhY2tncm91bmRUcmFuc3BhcmVudF09XCJ0cnVlXCI+PC9zbWUtbG9hZGluZy13aGVlbD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgI3Jlc2l6ZXJJbmRpY2F0b3JcclxuICBjbGFzcz1cInNtZS13aWR0aC14eHMgc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24tc3RyZXRjaC12IHNtZS1iYWNrZ3JvdW5kLWNvbG9yLWJhc2UtODAgc21lLWxheWVyLWZseW91dCBzbWUtbGF5b3V0LW5vbmVcIj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
5548
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1B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QUlwQyxzRUFNTTtRQUNOLG9DQUFrSCxtQkFBQTtRQUk5Ryx1RUErRU07UUFDUixpQkFBTTtRQUNOLG9DQUM2RTtRQUMzRSx1RUErSU07UUFDTixvQ0FBb0MsZUFBQSxlQUFBO1FBRUosdUJBQU07UUFBQSxpQkFBTSxFQUFBLEVBQUEsRUFBQSxFQUFBO1FBS2hELHNFQUNrSDtRQUNwSCxpQkFBTTtRQUNOLHNFQUdNO1FBQ1IsaUJBQU07UUFDTiwrQkFFTTs7UUF4VEosaUVBQW9ELDREQUFBLHdDQUFBLHlDQUFBLDZGQUFBO1FBUWpCLGVBQXNFO1FBQXRFLDBGQUFzRTtRQUdoRyxlQUFxRTtRQUFyRSxvR0FBcUU7UUFPbEQsZUFBa0I7UUFBbEIsMkNBQWtCO1FBK0I5QyxlQUEyRDtRQUEzRCwwRUFBMkQsd0NBQUEsd0NBQUEseUNBQUEsc0NBQUEsNkZBQUEsb0NBQUE7UUFNekQsZUFBdUc7UUFBdkcsd0ZBQXVHO1FBR3BHLGVBQTRCO1FBQTVCLGlEQUE0QjtRQVEzQixlQUEwQztRQUExQyxtRkFBMEM7UUFBQyxtQ0FBeUI7UUFFdEMsZUFBK0I7UUFBL0Isd0RBQStCO1FBaUZQLGVBQXdEO1FBQXhELHFFQUF3RDtRQUM5Ryw4RUFBcUM7UUFDUCxlQUFvQztRQUFwQyw2REFBb0M7UUF1SmhFLGVBQXlDO1FBQXpDLDhEQUF5QztRQUk5QyxlQUE4RTtRQUE5RSwrRkFBOEU7O3VGRGdoSXRFLGtCQUFrQjtjQUo5QixTQUFTOzJCQUNJLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdDaGVja2VkLFxyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBUZW1wbGF0ZVJlZixcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIFZpZXdDaGlsZHJlblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEVsZW1lbnRGb2N1c2luZ0V2ZW50LCBLZXlDb2RlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IENvcmVFbnZpcm9ubWVudCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9jb3JlLWVudmlyb25tZW50JztcclxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RpYWdub3N0aWNzL2xvZy1sZXZlbCc7XHJcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RpYWdub3N0aWNzL2xvZ2dpbmcnO1xyXG5pbXBvcnQgeyBEb20gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RvbS9kb20nO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTGF5b3V0LCBTTUVfTEFZT1VUX1BST1ZJREVSIH0gZnJvbSAnLi4vY29tbW9uL2xheW91dCc7XHJcbmltcG9ydCB7IFNwYWNlckJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9jb21tb24vc3BhY2VyLWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRm9ybUZpZWxkQ29udGFpbmVyIH0gZnJvbSAnLi4vZm9ybS9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLWZpZWxkL3NlYXJjaC9zZWFyY2gtZm9ybS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBRdWVyeURhdGEsIFF1ZXJ5RGF0YUl0ZW0sIFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUsIFF1ZXJ5RGF0YU9wZXJhbmQgfSBmcm9tICcuLi9xdWVyeS1lZGl0b3IvcXVlcnktZWRpdG9yLWNvbnRyYWN0JztcclxuaW1wb3J0IHsgRGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtYWNjZXNzaWJpbGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gICAgRGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50LFxyXG4gICAgRGF0YVRhYmxlRGF0YUl0ZW0sXHJcbiAgICBEYXRhVGFibGVMYXp5TG9hZEV2ZW50LFxyXG4gICAgRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLFxyXG4gICAgRGF0YVRhYmxlUmVuZGVyZWRJdGVtLFxyXG4gICAgRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZSxcclxuICAgIERhdGFUYWJsZVNvcnRNb2RlLFxyXG4gICAgRWRpdGFibGVEYXRhQ2hhbmdlU2V0LFxyXG4gICAgRWRpdGFibGVEYXRhSXRlbSxcclxuICAgIE5vZGVOYXZpZ2F0aW5nVGFzayxcclxuICAgIFRyZWVOb2RlRGF0YUl0ZW1cclxufSBmcm9tICcuL2RhdGEtdGFibGUtY29udHJhY3QnO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlciB9IGZyb20gJy4vZGF0YS10YWJsZS1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFB4Q29udmVydGVyIH0gZnJvbSAnLi9oZWxwZXJzL3B4LWNvbnZlcnRlcic7XHJcblxyXG4vKipcclxuICogRGF0YSB0YWJsZSBjb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtZGF0YS10YWJsZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBleHRlbmRzIFNwYWNlckJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBtaW5Db2x1bW5XaWR0aCA9IDUwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcHhDb252ZXJ0ZXIgPSBuZXcgUHhDb252ZXJ0ZXIoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnRGF0YVRhYmxlQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29tcG9uZW50SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZWRpdGFibGVEYXRhQ2hhbmdlU2V0OiBFZGl0YWJsZURhdGFDaGFuZ2VTZXQgPSB7XHJcbiAgICAgICAgYWRkZWRJdGVtczogW10sXHJcbiAgICAgICAgdXBkYXRlZEl0ZW1zOiBbXSxcclxuICAgICAgICBkZWxldGVkSXRlbXM6IFtdXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZGVmYXVsdFNjcm9sbFBpeGVscyA9IDkwO1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0U2Nyb2xsUGVyY2VudGFnZSA9IDAuNDtcclxuICAgIHByaXZhdGUgbWF4QWN0dWFsU2Nyb2xsRGF0YUVsZW1lbnRIZWlnaHQgPSA1MDAwMDA7XHJcbiAgICBwcml2YXRlIGZpbHRlckRlYm91bmNlVGltZW91dCA9IDMwMDtcclxuICAgIHByaXZhdGUga2V5Ym9hcmROYXZpZ2F0aW9uRGVib3VuY2VUaW1lb3V0ID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxDaGVja0ludGVydmFsRHVyYXRpb24gPSAzMDA7XHJcbiAgICBwcml2YXRlIHNjcm9sbENoZWNrSW50ZXJ2YWw7XHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgYnVmZmVyUm93UmF0ZSA9IDE7XHJcbiAgICBwcml2YXRlIGV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBzb3J0Q29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIHByZXZpb3VzU29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEl0ZW1zOiBEYXRhVGFibGVEYXRhSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBhY3R1YWxJdGVtczogRGF0YVRhYmxlRGF0YUl0ZW1bXTtcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRIYXNWZXJ0aWNhbE92ZXJmbG93OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJEZWJvdW5jZVRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3dUaW1lcjtcclxuICAgIHByaXZhdGUgb2xkRmlsdGVyS2V5d29yZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJLZXl3b3JkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGludGVybmFsR2xvYmFsRmlsdGVyOiBhbnk7XHJcbiAgICBwcml2YXRlIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgaXNTY3JvbGxpbmc6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXA6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRpc3BsYXlJdGVtc1RvcDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIGludGVybmFsU2VsZWN0aW9uOiBEYXRhVGFibGVEYXRhSXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIGhhc0xvbmdMaXN0OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQgPSAtMTtcclxuICAgIHByaXZhdGUgZGF0YVNjcm9sbFRvcDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEdyb3VwQ29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGludGVybmFsR3JvdXBTb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLk5vbmU7XHJcbiAgICBwcml2YXRlIGludGVybmFsU2VsZWN0aW9uTW9kZTogc3RyaW5nIHwgRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlO1xyXG4gICAgcHJpdmF0ZSBzaGFkb3dUcmVlOiBhbnk7IC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBtYWludGFpbiB0aGUgdHJlZSB0byBoZWxwIGRvIHRoZSBcInNhbWUgbGV2ZWwgb25seVwiIHNvcnQuXHJcbiAgICBwcml2YXRlIGFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIHByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgcmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSByZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gMDtcclxuICAgIHByaXZhdGUgY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gLTE7XHJcbiAgICBwcml2YXRlIHVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlcjogKCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgY29udGVudEFyZWFIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBlZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGxheW91dENoYW5nZVN1YnNjcmliZXI7XHJcbiAgICBwcml2YXRlIGdsb2JhbEZpbHRlclN1YnNjcmliZXI7XHJcbiAgICBwcml2YXRlIGdyb3VwS2V5czogeyBba2V5OiBzdHJpbmddOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSB9ID0ge307XHJcbiAgICBwcml2YXRlIGludGVybmFsQ29sdW1uczogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD47XHJcbiAgICBwcml2YXRlIHRyZWVUb2dnbGVTdGF0dXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICBwcml2YXRlIHNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIGludGVybmFsUXVlcnlFZGl0b3I6IFF1ZXJ5RGF0YTtcclxuICAgIHByaXZhdGUgYWN0dWFsQ29sdW1uUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCA9IDM7XHJcbiAgICBwcml2YXRlIGFjY2Vzc2liaWxpdHlNYW5hZ2VyID0gQ29yZUVudmlyb25tZW50LmFjY2Vzc2liaWxpdHlNYW5hZ2VyO1xyXG5cclxuICAgIHByaXZhdGUgaW50ZXJuYWxUYWJsZUFyaWFMYWJlbGxlZEJ5OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaW50ZXJuYWxUYWJsZUFyaWFMYWJlbDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzY3JvbGxEYXRhU3R5bGVUb3A6IHN0cmluZztcclxuICAgIHB1YmxpYyBzY3JvbGxBYm92ZURhdGFTdHlsZVRvcDogc3RyaW5nO1xyXG4gICAgcHVibGljIGlzTG9hZGluZyA9IHRydWU7XHJcbiAgICBwdWJsaWMgZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBuZXcgRGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIoKTtcclxuICAgIHB1YmxpYyBEYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlcjogRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXI7XHJcbiAgICBwdWJsaWMgY29sdW1uU29ydFNldHRpbmdzID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNlbGVjdGVkIG5vZGUgZnJvbSB0aGUgdGFibGUgaXMgY29sbGFwc2VkIGZyb20gdGhlIHBhcmVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdGVkVHJlZU5vZGVQYXJlbnRDb2xsYXBzZWQgPSBmYWxzZTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdyZXNpemVySW5kaWNhdG9yJylcclxuICAgIHByaXZhdGUgcmVzaXplckluZGljYXRvcjogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdoZWFkZXInKVxyXG4gICAgcHJpdmF0ZSBoZWFkZXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclRhYmxlJylcclxuICAgIHByaXZhdGUgaGVhZGVyVGFibGVFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnKVxyXG4gICAgcHJpdmF0ZSBjb250ZW50RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHJpdmF0ZSBzY3JvbGxDb250YWluZXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBSb3cnKVxyXG4gICAgcHJpdmF0ZSB0ZW1wUm93RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxCb2R5JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgc2Nyb2xsQm9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQWJvdmVEYXRhJylcclxuICAgIHByaXZhdGUgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxEYXRhJylcclxuICAgIHByaXZhdGUgc2Nyb2xsRGF0YUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlNZXNzYWdlJylcclxuICAgIHByaXZhdGUgZW1wdHlNZXNzYWdlRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCcpXHJcbiAgICBwcml2YXRlIGxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoJ2dyb3VwJylcclxuICAgIHB1YmxpYyBncm91cEhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdjaGFuZ2VzZXRVcGRhdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25DaGFuZ2VzZXRVcGRhdGVkKCk6IEV2ZW50RW1pdHRlcjxFZGl0YWJsZURhdGFDaGFuZ2VTZXQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VzZXRVcGRhdGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2VzZXRVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0YWJsZURhdGFDaGFuZ2VTZXQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBlbWl0cyB0aGUgZXZlbnQgd2hlbiBzZWxlY3Rpb24gY2hhbmdpbmcgaXMgaGFwcGVuaW5nLlxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZURhdGFJdGVtPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdHJ1ZSB3aGVuIHRhYmxlIGlzIHJlbmRlcmVkIHdpdGggbWluLWhlaWdodCBvbiBwaG9uZSBkb3duXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgaXNUYWJsZVJlbmRlcmVkV2l0aE1pbkhlaWdodFBob25lRG93bjogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdyb3dEYmxjbGljaycgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uUm93RGJsY2xpY2soKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0RibGNsaWNrO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyByb3dEYmxjbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdncm91cFRvZ2dsZUNsaWNrJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Hcm91cFRvZ2dsZUNsaWNrZWQoKTogRXZlbnRFbWl0dGVyPHsgZ3JvdXBEYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBUb2dnbGVDbGljaztcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ3JvdXBUb2dnbGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBncm91cERhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2VkaXRhYmxlUm93QWRkZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbk5ld0VkaXRhYmxlUm93QWRkZWQoKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogYW55LCBvdmVycmlkZU5ld0RhdGFIYW5kbGVyOiAoZGF0YTogYW55KSA9PiB2b2lkIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZVJvd0FkZGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBlZGl0YWJsZVJvd0FkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGRhdGE6IGFueSwgb3ZlcnJpZGVOZXdEYXRhSGFuZGxlcjogKGRhdGE6IGFueSkgPT4gdm9pZCB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBjb2x1bW5zIHJlbmRlcmVkIG9uIHRoZSBVSS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjb2x1bW5zKCk6IFF1ZXJ5TGlzdDxEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbENvbHVtbnM7XHJcbiAgICB9XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpXHJcbiAgICBwdWJsaWMgc2V0IGNvbHVtbnModmFsdWU6IFF1ZXJ5TGlzdDxEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ+KSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbENvbHVtbnMgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1ucygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQFZpZXdDaGlsZHJlbihEYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudClcclxuICAgIHByaXZhdGUgZGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnRzOiBRdWVyeUxpc3Q8RGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnQ+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBhY3R1YWwgY29sdW1ucyB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRhYmxlLlxyXG4gICAgICogSW4gZ3JvdXBpbmcgZGF0YSB0YWJsZSBzY2VuYXJpbywgdGhlIGFjdHVhbCBjb2x1bW5zIGRvZXNuJ3QgY29udGFpbiB0aGUgZ3JvdXBpbmcgY29sdW1uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWN0dWFsQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50W107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGl0ZW0gcmVuZGVyZWQgb24gdGhlIFVJIChpbmNsdWRpbmcgdGhlIGl0ZW1zIGluIGFuZCBvdXRzaWRlIG9mIHZpZXcgcG9ydCkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcmVuZGVyZWRJdGVtcygpOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxSZW5kZXJlZEl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgcmVuZGVyZWRJdGVtcyh2YWx1ZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW10pIHtcclxuICAgICAgICB0aGlzLmludGVybmFsUmVuZGVyZWRJdGVtcyA9IHZhbHVlIHx8IFtdO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0NoYW5nZS5lbWl0KCk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcm93Y291bnQnLCB2YWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBEYXRhVGFibGVEYXRhSXRlbVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgcmVuZGVyZWQgaXRlbXMgYXJlIGNoYW5nZWQuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHJlbmRlcmVkSXRlbXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBhcmUgYW55IGJhY2tncm91bmQgYnVzeSB0YXNrcy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpc0J1c3k6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBlbmFibGUgdGhlIHJpZ2h0IGNsaWNrIHNlbGVjdFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGVuYWJsZVJpZ2h0Q2xpY2tTZWxlY3QgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgbWVzc2FnZSBzaG93aW5nIHdoZW4gdGhlIGRhdGEgaXMgbG9hZGluZy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBsb2FkaW5nTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBtZXNzYWdlIHNob3dpbmcgd2hlbiB0aGUgZGF0YSBsb2FkaW5nIGlzIGZpbmlzaGVkIGJ1dCB0aGUgZGF0YSBpcyBlbXB0eSBvciBubyBkYXRhIGdvdCByZW5kZXJlZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBub1JlY29yZE1lc3NhZ2U6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGVkaXRhYmxlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gZXhwYW5kIHRyZWUgbm9kZSBvbiByb290IG5vZGUgY2hlY2tlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIG9ubHkgYmUgdXNlZCBmb3IgdHJlZSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBleHBhbmRUcmVlTm9kZU9uQ2hlY2tlZCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciBhbGwgZWRpdGFibGUgcm93cyBpbiBhbiBlZGl0YWJsZSB0YWJsZSBzaG91bGQgYmUgdmlzaWJsZSAocmVnYXJkbGVzcyBvZiBob3Zlci9zZWxlY3RlZCBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXNBbGxFZGl0YWJsZVJvd3NWaXNpYmxlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgKiBJdCBpbmRpY2F0ZXMgdGhhdCBhIHNjcm9sbGJhciBjYW4gYmUgdXNlZCB3aGVuIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgY29sdW1ucyBpcyBodWdlXHJcbiAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzY3JvbGxhYmxlSG9yaXpvbnRhbCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoYXQgYSBkYXRhIGxhenkgbG9hZGluZyBuZWVkcyB0byBoYXBwZW4gYW5kIHJlcXVpcmUgdGhlIGNvbnN1bWVyIHRvIHByb3ZpZGUgZGF0YSBmb3IgdGhlIGxhenkgbG9hZGluZyBwYXJ0LlxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBsYXp5TG9hZGluZ0RhdGE6IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVMYXp5TG9hZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlTGF6eUxvYWRFdmVudD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgZXhwYW5kZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVFeHBhbmRlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTm9kZUV4cGFuZCgpOiBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlRXhwYW5kZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG5vZGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCB0cmlnZ2VycyB3aGVuIGEgdHJlZSBub2RlIGlzIGNvbGxhcHNlZC5cclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnbm9kZUNvbGxhcHNlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTm9kZUNvbGxhcHNlZCgpOiBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlQ29sbGFwc2VkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlQ29sbGFwc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVTZWxlY3RlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTm9kZVNlbGVjdCgpOiBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlU2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG5vZGVTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGRhdGEgaXMgbG9hZGVkIGluIGxhenkgbG9hZGluZyB3YXkuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbGF6eUxvYWQ6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byByZW1lbWJlciB0aGUgdHJlZSB0b2dnbGUgc3RhdHVzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJlbWVtYmVyVHJlZU5vZGVUb2dnbGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byByZW1lbWJlciB0aGUgc2VsZWN0aW9uIHRoZW4gYWZ0ZXIgdGhlIHdob2xlIGRhdGEgc291cmNlIGlzIHJlZnJlc2hlZCB0aGUgc2VsZWN0aW9uIHdpbGwgc3RpbGwgYmUgdGhlcmUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcmVtZW1iZXJTZWxlY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTm9ybWFsbHkgdGhlIGVudGVyIGtleSBvbiBhIHJvdyByZWRpcmVjdHMgdG8gdGhlIGRvdWJsZSBjbGljayBiZWhhdmlvciBvZiB0aGUgcm93LlxyXG4gICAgICogSWYgdGhpcyBmbGFnIGlzIHRydWUsIHRoZW4gZGF0YSB0YWJsZSB3b3VsZCBkbyBub3RoaW5nIGZvciBlbnRlciBrZXkgb24gYSByb3cuXHJcbiAgICAgKiBUaGVuIHlvdSBuZWVkIHRvIGltcGxlbWVudCB0aGUgZW50ZXIga2V5IGFjdGlvbiBieSB5b3VyIHNlbGYuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcHJldmVudEVudGVyS2V5Rm9yRGVmYXVsdEFjdGlvbjogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHBvaW50cyB0byB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYW4gdW5pcXVlIGlkZW50aXR5IHN0cmluZyBmb3IgYW55IGRhdGEgaXRlbS5cclxuICAgICAqIFNvbWUgc2NlbmFyaW9zIGxpa2UgdHJlZSB0YWJsZSB3b3VsZCBuZWVkIHRoaXMgZnVuY3Rpb24gdG8gcmVtZW1iZXIgdG9nZ2xlIHN0YXR1cyBmb3IgYW55IHRyZWUgbm9kZSBieSB0aGUgaWRlbnRpdHkuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb246IChkYXRhOiBhbnkpID0+IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ5IGRlZmF1bHQgbmF0dXJhbCBzb3J0IGlzIHR1cm5lZCBvbi5cclxuICAgICAqIEJ1dCBmb3IgcGVyZm9ybWFuY2UgY29uY2VybiwgeW91IG1heSB3YW50IHRvIGRpc2FibGUgbmF0dXJhbCBzb3J0IGFuZCBqdXN0IGRvIHZlcnkgc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRpc2FibGVOYXR1cmFsU29ydCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRG9uJ3QgZW5hYmxlIGRlZmF1bHQgdG9vbHRpcHMgYWxsIG92ZXIgV0FDIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBUT0RPOiBJbnZlc3RpZ2F0ZSBlYWNoIGNhc2Ugb2YgZGF0YSB0YWJsZSB1c2FnZSBhbmQgc2VlIGlmIGNhbiB1cGRhdGUgYXMgbmVlZGVkIHRvIGFsbG93IHRoaXMgdG8gYmUgZW5hYmxlZCBieSBkZWZhdWx0LlxyXG4gICAgICogRW5hYmxpbmcgYnkgZGVmYXVsdCBwcmUtR0EgaXMgcmlza3kgYW5kIG1heSBpbnRyb2R1Y2UgcmVncmVzc2lvbnMgdGhvdWdoLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGVuYWJsZURlZmF1bHRUb29sdGlwcyA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBpdGVtcyByZW5kZXJlZCBhYm92ZSB0aGUgdmlldyBwb3J0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQ6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBpdGVtcyByZW5kZXJlZCBpbiBhbmQgYmVsb3cgdGhlIHZpZXcgcG9ydC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbmRlcmVkSXRlbXNJbkFuZEJlbG93Vmlld1BvcnQ6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgaXMgc2Nyb2xsZWQgZG93bi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzU2Nyb2xsZWREb3duOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgc2hvdWxkIGhhbmRsZSBzY3JvbGxpbmcgZm9yIGNvbnRlbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG91bGRTY3JvbGw6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbGFzdCBmb2N1c2FibGUgc2hhZG93IGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQuXHJcbiAgICAgKiBOb3JtYWxseSB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIHRoZSBsYXN0IGZvY3VzYWJsZSBlbGVtZW50LFxyXG4gICAgICogdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnQgbmVlZCB0byBiZSB1c2VkIHRvIGhhbmRsZSBmb2N1cyBtb3ZlbWVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3VsZFVzZUxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2Nyb2xsIHRvIHNlbGVjdGlvbiBhZnRlciBzb3J0aW5nLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3VsZFNjcm9sbFRvU2VsZWN0aW9uQWZ0ZXJTb3J0aW5nOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBhbmQgc2V0cyB0aGUgZ2xvYmFsIGZpbHRlciB2YWx1ZSBodG1sIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGdsb2JhbEZpbHRlcigpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsR2xvYmFsRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZ2xvYmFsRmlsdGVyKGdsb2JhbEZpbHRlcjogYW55KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnRIYW5kbGVyID0gKGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmlsdGVyRGVib3VuY2VUaW1lcik7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9TZWFyY2goZ2xvYmFsRmlsdGVyWyd2YWx1ZSddKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckRlYm91bmNlVGltZW91dCk7XHJcbiAgICAgICAgfSkuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgY29uc3QgZG9TZWFyY2ggPSAoa2V5d29yZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyS2V5d29yZCA9IGtleXdvcmQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcktleXdvcmQgIT09IHRoaXMub2xkRmlsdGVyS2V5d29yZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIuZW1pdCh0aGlzLmZpbHRlcktleXdvcmQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMub2xkRmlsdGVyS2V5d29yZCA9IHRoaXMuZmlsdGVyS2V5d29yZDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmludGVybmFsR2xvYmFsRmlsdGVyID0gZ2xvYmFsRmlsdGVyO1xyXG4gICAgICAgIGlmIChnbG9iYWxGaWx0ZXIpIHtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbEZpbHRlciBpbnN0YW5jZW9mIFNlYXJjaEZvcm1GaWVsZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJTdWJzY3JpYmVyID0gZ2xvYmFsRmlsdGVyLnNlYXJjaC5zdWJzY3JpYmUoa2V5d29yZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnNlYXJjaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvU2VhcmNoKGtleXdvcmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuc2VhcmNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBldmVudEhhbmRsZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRVbnJlZ2lzdHJhdGVySGFuZGxlcnMucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBldmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBDYXNlIFNlbnNpdGl2ZSBmbGFnIGZvciBmaWx0ZXJpbmcuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2FzZVNlbnNpdGl2ZUZpbHRlcjogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZCBhcyBhIHRyZWUgZGF0YSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93QXNUcmVlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIG5ldyBpdGVtXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZWRpdGFibGVOZXdEYXRhSXRlbTogRGF0YVRhYmxlRGF0YUl0ZW07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBkYXRhIHNvdXJjZSBvZiB0aGUgZGF0YSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgaXRlbXMoKTogRGF0YVRhYmxlRGF0YUl0ZW1bXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5jb250ZW50KSA6IHRoaXMuaW50ZXJuYWxJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGl0ZW1zKHZhbHVlOiBEYXRhVGFibGVEYXRhSXRlbVtdKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0RnJvbVJvdygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxJdGVtcyA9IHZhbHVlO1xyXG5cclxuICAgICAgICBsZXQgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IG5lZWQgdG8gcmVmYWN0b3IgdG8gcmVkdWNlIHRoZSBuZXN0ZWQgaWYgYmxvY2tzLlxyXG4gICAgICAgIGlmICh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXI6IHN0cmluZztcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0aW9uKSAmJiB0aGlzLnNlbGVjdGlvbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5wdXNoKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oaXRlbS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLnB1c2godGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihpdGVtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5zZWxlY3Rpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIgPSB0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKHRoaXMuc2VsZWN0aW9uLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXR5VG9SZW1lbWJlciA9IHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24odGhpcy5zZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IHZhbHVlLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPEVkaXRhYmxlRGF0YUl0ZW0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25BbGVydHM6IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24gJiYgdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2Rlc1RvUHJvY2Vzcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlc1RvUHJvY2Vzc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3Muc3BsaWNlKDAsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5pbmRleE9mKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oY3VycmVudE5vZGUuZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGN1cnJlbnROb2RlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGFyZW50ID0gY3VycmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3MucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmluZGV4T2YodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihpdGVtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNUb1Byb2Nlc3MgPSB0aGlzLml0ZW1zLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2Rlc1RvUHJvY2Vzcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlc1RvUHJvY2Vzc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3Muc3BsaWNlKDAsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oY3VycmVudE5vZGUuZGF0YSkgPT09IHNlbGVjdGlvbklkZW50aXR5VG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZm91bmQgaW4gdGhlIHJlZnJlc2ggaXRlbXMsIHRoZW4gaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oaXRlbSkgPT09IHNlbGVjdGlvbklkZW50aXR5VG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcjogRGF0YVRhYmxlRGF0YUl0ZW07XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXI6IERhdGFUYWJsZURhdGFJdGVtW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbikgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5wdXNoKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLnNlbGVjdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIgPSB0aGlzLnNlbGVjdGlvbi5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIgPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IHZhbHVlLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPEVkaXRhYmxlRGF0YUl0ZW0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25BbGVydHM6IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pbnRlcm5hbEl0ZW1zLnNsaWNlKDApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZXNUb1Byb2Nlc3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Byb2Nlc3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnNwbGljZSgwLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLmluZGV4T2YoY3VycmVudE5vZGUuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY3VycmVudE5vZGUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudCA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNUb1Byb2Nlc3MgPSB0aGlzLml0ZW1zLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2Rlc1RvUHJvY2Vzcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlc1RvUHJvY2Vzc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3Muc3BsaWNlKDAsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmRhdGEgPT09IHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGZvdW5kIGluIHRoZSByZWZyZXNoIGl0ZW1zLCB0aGVuIGl0IG1lYW5zIHRoZSBzZWxlY3Rpb24gaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gY3VycmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSBzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZXNldEVkaXRhYmxlRGF0YUNoYW5nZXNldCgpO1xyXG5cclxuICAgICAgICBpZiAoaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgaXRlbXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGV4cG9zZXMgdGhlIGVudW0gdHlwZSB0aGVuIGluIHRlbXBsYXRlIHdlIGNhbiBkaXJlY3RseSByZWZlciB0byB0aGUgZW51bSB2YWx1ZSBuYW1lIGluc3RlYWQgb2YgZW51bSB2YWx1ZSBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzb3J0TW9kZUVudW06IGFueSA9IERhdGFUYWJsZVNvcnRNb2RlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZXhwb3NlcyB0aGUgZW51bSB0eXBlIHRoZW4gaW4gdGVtcGxhdGUgd2UgY2FuIGRpcmVjdGx5IHJlZmVyIHRvIHRoZSBlbnVtIHZhbHVlIG5hbWUgaW5zdGVhZCBvZiBlbnVtIHZhbHVlIG51bWJlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbmRlcmVkSXRlbVR5cGVFbnVtOiBhbnkgPSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBhbmQgc2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSBkYXRhIHNvdXJjZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0aW9uKCk6IERhdGFUYWJsZURhdGFJdGVtIHwgRGF0YVRhYmxlRGF0YUl0ZW1bXSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlID8gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5tYXAoaXRlbSA9PiBpdGVtLmNvbnRlbnQpIDogdGhpcy5pbnRlcm5hbFNlbGVjdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdLmNvbnRlbnQgOiB0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb24oc2VsZWN0aW9uOiBEYXRhVGFibGVEYXRhSXRlbSB8IERhdGFUYWJsZURhdGFJdGVtW10pIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbnRlbnQgPSBzZWxlY3Rpb24ubWFwKHMgPT4gcy5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSB0aGlzLmludGVybmFsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gc2VsZWN0aW9uQ29udGVudC5pbmRleE9mKGl0ZW0uY29udGVudCkgIT09IC0xKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb24gfHwgW107XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24ubWFwKHNlbGVjdGlvbkl0ZW0gPT4gc2VsZWN0aW9uSXRlbS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbEl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uY29udGVudCA9PT0gc2VsZWN0aW9uKVswXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBhY3R1YWxTZWxlY3Rpb24gPyBbYWN0dWFsU2VsZWN0aW9uXSA6IFtdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHNlbGVjdGlvbiA/IFtzZWxlY3Rpb25dIDogW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IHN0cmluZyB8IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25Nb2RlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb25Nb2RlKHZhbHVlOiBzdHJpbmcgfCBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uTW9kZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYSB0ZW1wIGNvZGUgdG8gc29sdmUgdGhlIHByb2JsZW0gdGhhdDpcclxuICAgICAgICAvLyB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlIGFuZCBhbiBpbml0aWFsIGFycmF5IHZhbHVlIGlzIGFzc2lnbmVkIHRvIHRoZSBzZWxlY3Rpb24gcHJvcGVydHksXHJcbiAgICAgICAgLy8gYXQgdGhhdCBtb21lbnQgdGhlIHNlbGVjdGlvbk1vZGUgcHJvcGVydHkgaXMgbm90IHNldCB0byBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSB2YWx1ZSwgeWV0LlxyXG4gICAgICAgIC8vIFNvIHdlIHRyZWF0IHRoZSBpbml0aWFsIGFycmF5IHZhbHVlIGFzIGEgbWVtYmVyIG9mIHRoZSBzZWxlY3Rpb24gYXJyYXkgaW5zdGVhZCBvZiB0aGUgc2VsZWN0aW9uIGFycmF5LlxyXG4gICAgICAgIC8vIFNvIHdlIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gZml4IHRoaXMgcHJvYmxlbS5cclxuICAgICAgICAvLyBUT0RPOiBsb25nIHRlcm0gd2lzZSwgd2UgbmVlZCB0byB1c2Ugc2VwZXJhdGVkIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIG1haW50YWluIHRoZSBzZWxlY3Rpb25zIG9mIHNlbGVjdGlvblxyXG4gICAgICAgIC8vIHNlbGVjdGlvbiBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uLlxyXG4gICAgICAgIC8vIFRoaXMgY2hhbmdlIHdpbGwgaGFwcGVuIGluIHRoZSBjb21pbmcgcmVsZWFzZS5cclxuICAgICAgICBpZiAodmFsdWUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmludGVybmFsU2VsZWN0aW9uKSAmJiB0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF0pKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvblswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRlZmF1bHRTb3J0Q29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0U29ydE1vZGU6IERhdGFUYWJsZVNvcnRNb2RlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gZmlsdGVyaW5nIGlzIGhhcHBlbmluZy5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBzZWxlY3RlZC5cclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnZmlsdGVyJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25GaWx0ZXIoKTogRXZlbnRFbWl0dGVyPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcjtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZG9DdXN0b21Tb3J0OiBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gYSByb3cgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd1NlbGVjdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Sb3dTZWxlY3QoKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyByb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gYSByb3cgaXMgdW5zZWxlY3RlZCBhbmQgbm8gcm93IGlzIHNlbGVjdGVkLlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdyb3dVbnNlbGVjdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Sb3dVbnNlbGVjdCgpOiBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm93VW5zZWxlY3RlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcm93VW5zZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBvciBzZXRzIHRoZSBncm91cCBjb2x1bW4uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGdyb3VwQ29sdW1uKCk6IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxHcm91cENvbHVtbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZ3JvdXBDb2x1bW4odmFsdWU6IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLmludGVybmFsR3JvdXBDb2x1bW4gIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxHcm91cENvbHVtbiA9IHZhbHVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zT3JkZXIgJiYgdGhpcy5jb2x1bW5zT3JkZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1uc01haW4oKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgb3Igc2V0cyB0aGUgZ3JvdXAgc29ydCBtb2RlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBncm91cFNvcnRNb2RlKCk6IERhdGFUYWJsZVNvcnRNb2RlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEdyb3VwU29ydE1vZGU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGdyb3VwU29ydE1vZGUodmFsdWU6IERhdGFUYWJsZVNvcnRNb2RlKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbEdyb3VwU29ydE1vZGUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBncm91cCB0b2dnbGUgc2hvdWxkIGJlIHVzZWQgdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBncm91cC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB1c2VHcm91cFRvZ2dsZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgdGhlIGhlYWRlci5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93SGVhZGVyID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgXCJhcmlhLWxhYmVsbGVkYnlcIiB2YWx1ZSBmb3IgdGhlIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCB0YWJsZUFyaWFMYWJlbGxlZEJ5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbGxlZEJ5O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB0YWJsZUFyaWFMYWJlbGxlZEJ5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsVGFibGVBcmlhTGFiZWxsZWRCeSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJpYUF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgXCJhcmlhLWxhYmVsXCIgdmFsdWUgZm9yIHRoZSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgdGFibGVBcmlhTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFRhYmxlQXJpYUxhYmVsO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB0YWJsZUFyaWFMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlQXJpYUxhYmVsID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBcmlhQXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHNob3VsZCB0aGUgZGF0YSB0YWJsZSBoYXMgdGhlIGdyaWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0dyaWQgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgXCJhbGwgaXRlbVwiIGNoZWNrYm94LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dBbGxJdGVtQ2hlY2tib3ggPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY2hlY2sgdGhlIGl0ZW0gYW5kIHVuY2hlY2sgb3RoZXIgaXRlbXMgd2hlbiB0aGUgY3VycmVudCBpdGVtIGlzIGNoZWNrZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VsZWN0QW5kQ2hlY2sgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSByb3cgaGVpZ2h0IGZvciBlYWNoIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcm93SGVpZ2h0ID0gMzA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBsaW5rIHRoZSBzZWxlY3Rpb25zIG9mIHBhcmVudCBub2RlcyBhbmQgY2hpbGQgbm9kZXMuXHJcbiAgICAgKiBJdCBvbmx5IGFwcGx5IHRvIHRyZWUgdGFibGUgc2NlbmFyaW8uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbGlua1BhcmVudENoaWxkcmVuU2VsZWN0aW9ucyA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzZWxlY3QgdGhlIGl0ZW0gd2hlbiBuYXZpZ2F0aW5nIHdpdGggdGhlIGtleWJvYXJkIChlLmcuIGFycm93IGtleXMsIGhvbWUsIGVuZCwgcGFnZSB1cCwgcGFnZSBkb3duKVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdEl0ZW1XaGVuTmF2aWdhdGluZ1dpdGhLZXlib2FyZCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBpcyBzY3JvbGxhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNjcm9sbGFibGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUncyBVSSB2aXJ0dWFsaXphdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGlzYWJsZVVJVmlydHVhbGl6YXRpb24gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlIGl0ZW1zIGFyZSBzZWxlY3RhYmxlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VsZWN0YWJsZSA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZWRpdGFibGUgZGF0YSB0YWJsZSBhbGxvdyBhdXRvbWF0aWNhbGx5IGFkZGluZyBuZXcgcm93c1xyXG4gICAgICogU2V0dGluZyB0aGlzIHRvIGZhbHNlIHRoZW4gaGF2ZSB0byBjcmVhdGUgbmV3IGxpbmUgb3V0c2lkZSBvZiB0aGUgZGF0YXRhYmxlIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlZGl0YWJsZUF1dG9OZXdSb3cgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBkZWZhdWx0IHN0YXR1cyBvZiB0aGUgZ3JvdXAgdG9nZ2xlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRlZmF1bHRHcm91cFRvZ2dsZUV4cGFuZGVkID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGF1dG9Sb3dIZWlnaHQgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIGNvbHVtbnNPcmRlcjogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBncm91cFRvZ2dsZVN0YXR1czogeyBbZ3JvdXA6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gICAgcHVibGljIG5vZGVOYXZpZ2F0aW5nVGFzazogTm9kZU5hdmlnYXRpbmdUYXNrO1xyXG4gICAgcHVibGljIGlzQ29sdW1uV2lkdGhDYWxjdWxhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWY7XHJcblxyXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZTtcclxuXHJcbiAgICBwcml2YXRlIGxheW91dDogTGF5b3V0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IGluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBpbmplY3Rvci5nZXQoTmdab25lKTtcclxuICAgICAgICB0aGlzLmxheW91dCA9IGluamVjdG9yLmdldChTTUVfTEFZT1VUX1BST1ZJREVSLCBudWxsLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFZGl0YWJsZURhdGFDaGFuZ2VTZXQoKTogRWRpdGFibGVEYXRhQ2hhbmdlU2V0IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSA/IHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXRTY3JvbGwoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBzY3JvbGxUb3AoZGlzdGFuY2UgZnJvbSB0aGUgZWxlbWVudCdzIHRvcCB0byBpdHMgdG9wbW9zdCB2aXNpYmxlIGNvbnRlbnQpXHJcbiAgICAgICAgLy8gb2YgU2Nyb2xsIGNvbnRhaW5lciB0byAwLlxyXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcblxyXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gcmVzZXQgJ3RoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0JyB0byAwLCBhcyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0XHJcbiAgICAgICAgLy8gYWRqdXN0ZWQgdG8gMCBpbiAnY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoKScuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVVJVmlydHVhbGl6YXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uID0gZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5pZDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICd0cmVlZ3JpZCcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZ3JpZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFibGUnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxheW91dCkge1xyXG4gICAgICAgICAgICB0aGlzLkRhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyID0gbmV3IERhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyKHRoaXMubGF5b3V0KTtcclxuICAgICAgICAgICAgLy8gb24gcGFyZW50IGxheW91dCBjaGFuZ2VzLCByZS1lbWl0IHRoZSBsYXlvdXQgY2hhbmdlIHRvIG91ciBldmVudFxyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dC5sYXlvdXRDaGFuZ2VkLnN1YnNjcmliZSgoKCkgPT4gdGhpcy5vbkxheW91dENoYW5nZWQoKSkpKTtcclxuICAgICAgICAgICAgLy8gb24gd2luZG93IGJyZWFrIHBvaW50IGNoYW5nZXMsIGVtaXQgdGhlIGV2ZW50IGFib3V0IGNyaXRpY2FsIGNsYXNzZXMgYW5kIHN0eWxpbmcgdXBkYXRlcyBzaWduYWwuXHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0LndpbmRvd0JyZWFrcG9pbnRDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uV2luZG93QnJlYWtwb2ludENoYW5nZWQoKSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kZWZlcnJlZE9uTGF5b3V0Q2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIEFzIHRoZSB1c2VyIHNjcm9sbHMgb24gdGhlIHggYXhpcyBvZiB0aGUgYm9keSBvZiB0aGUgdGFibGUsIHdlXHJcbiAgICAgICAgICAgICAqIG5lZWQgdG8gbW92ZSB0aGUgY29ycmVzcG9uZGluZyBjb2x1bW4gaGVhZGVycyBvZiB0aGUgdGFibGUgaW50b1xyXG4gICAgICAgICAgICAgKiB2aWV3LlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdtYXJnaW4tbGVmdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAkey10aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0fXB4YCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRTb3J0Q29sdW1uICYmIHRoaXMuZGVmYXVsdFNvcnRNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbiA9IHRoaXMuZGVmYXVsdFNvcnRDb2x1bW47XHJcbiAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbi5zb3J0TW9kZSA9IHRoaXMuZGVmYXVsdFNvcnRNb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleEJ5U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc2liaWxpdHlNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5yZWdpc3Rlck9uRWxlbWVudEZvY3VzaW5nRXZlbnRIYW5kbGVyID1cclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzaWJpbGl0eU1hbmFnZXIucmVnaXN0ZXJFbGVtZW50Rm9jdXNpbmdFdmVudCh0aGlzLm9uRWxlbWVudEZvY3VzaW5nLmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVBcmlhQXR0cmlidXRlcygpO1xyXG5cclxuICAgICAgICAvLyBUT0RPOiBsb29rIGludG8gaW1wcm92ZW1lbnRzLCBhZGRpbmcgc2V0VGltZW91dCBoZXJlIG1ha2VzIHRoZSBjb21wb25lbnQgbGlmZSBjeWNsZSBoYXJkIHRvIG1hbmFnZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudEluVHJhcCh0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3VsZFVzZUxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50ID0gIW5leHRFbGVtZW50O1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBjYWxjdWxhdGVzIHRoZSBhY3R1YWwgc2VsZWN0ZWQgcm93IGZyb20gdGhlIGRhdGEgdGFibGUgZGF0YSBhbmQgYXBwbHkgcHJvcGVyIGNzcyBjbGFzcyB0byBpdCB2aXN1YWxseS5cclxuICAgICAqIEBwYXJhbSByZW5kZXJlZEl0ZW0gdGhlIHJlbmRlcmVkIGl0ZW0gZm9yIHRoZSBkYXRhIHRhYmxlLlxyXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcm93IHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgc2VsZWN0ZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvd0Rpc3BsYXlBc1NlbGVjdGVkKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpICYmIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNpbmdsZSAmJlxyXG4gICAgICAgICAgICAoIXRoaXMuc2hvd0FzVHJlZSB8fCB0aGlzLnNob3dBc1RyZWUgJiYgIXRoaXMuc2VsZWN0ZWRUcmVlTm9kZVBhcmVudENvbGxhcHNlZCkgfHwgdGhpcy5pc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkhlYWRlclRhYmxlUHJlc3NlZChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRG93bkFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRSZW5kZXJlZEl0ZW0odHJ1ZSwgLTEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5MZWZ0QXJyb3c6XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5VcEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb0hlYWRPZlJlbmRlcmVkSXRlbXMoKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IERvbS5nZXRQcmV2aW91c1pvbmVFbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlJpZ2h0QXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvSGVhZE9mUmVuZGVyZWRJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRab25lRWxlbWVudChjdXJyZW50RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbikge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudFRhYmxlS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLm9uQ29udGVudFRhYmxlS2V5VXAoZXZlbnQsIHRoaXMuY29udGVudEVsZW1lbnQsIHRoaXMuZWRpdGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXJiaXRyYXJ5U2Nyb2xsKHNjcm9sbFRvcDogbnVtYmVyLCBpc0luY3JlbWVudD86IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoaXNJbmNyZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgfSBlbHNlIGlmICghaXNJbmNyZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgaWYgKGRpZmYgPiBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCArPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA8PSBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGlmIChkaWZmID4gc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLT0gc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPD0gc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50VGFibGVQcmVzc2VkKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgIT09IEtleUNvZGUuQ3RybCAmJiBldmVudC5rZXlDb2RlICE9PSBLZXlDb2RlLlNoaWZ0KSB7XHJcbiAgICAgICAgICAgIENvcmVFbnZpcm9ubWVudC5hY2Nlc3NpYmlsaXR5TWFuYWdlci5jaGFuZ2VBY2Nlc3NpYmlsaXR5TW9kZSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb3cgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3Rvcih0YXJnZXRFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpO1xyXG4gICAgICAgIC8vIGN0cmxLZXkgZm9yIHNpbmdsZSBzZWxlY3Rpb24gbW9kZSB3b3JrcyBmaW5lXHJcbiAgICAgICAgLy8gY3RybEtleSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uIHdpbGwgYmUgcmVnYXJkZWQgYXMgc2VsZWN0IGFsbCByb3dzIHRoYXRcclxuICAgICAgICAvLyB3aWxsIGJlIGhhbmRsZWQgbm90IGhlcmUuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgIWV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmV0dXJuID0gdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlclxyXG4gICAgICAgICAgICAgICAgLmVkaXRhYmxlRGF0YVRhYmxlT25Db250ZW50VGFibGVQcmVzc2VkSGFuZGxlcihldmVudCwgdGFyZ2V0RWxlbWVudCwgY3VycmVudFJvdywgdGhpcy5sYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChzaG91bGRSZXR1cm4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuQ3RybCB8fCBldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlNoaWZ0KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAvLyBGb3Igbm93IGFzc3VtaW5nIHRyZWUgdGFibGUgZmlyc3QgZm9jdXMgb24gcm93IGFuZCB0aGVuXHJcbiAgICAgICAgLy8gdGhlIHVzZXIgaGFzIHRvIGhpdCBlbnRlci9zcGFjZSB0byBzZWxlY3QgdGhpcyBmb2N1c2VkIGl0ZW1cclxuICAgICAgICAvLyBGb3Igb3RoZXIgdHlwZSBvZiB0YWJsZSB3aWxsIGZpcnN0IHNlbGVjdCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx5IGZvY3VzIGJ5IGRlZmF1bHRcclxuICAgICAgICBjb25zdCBzZWxlY3RBbmRGb2N1cyA9ICF0aGlzLnNob3dBc1RyZWU7XHJcblxyXG4gICAgICAgIC8vIE9ubHkgdGhlIHNjcm9sbGluZyByZWxhdGVkIG5hdmlnYXRpb24ga2V5Ym9hcmQgb3BlcmF0aW9ucyBuZWVkIGRlYm91bmNpbmcuXHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5BOlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2VsZWN0IGFsbCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHNvIGhhbmRsZSB3aGVuIGVkaXRhYmxlIGRhdGF0YWJsZSBhbmQgdGhlIGZvY3VzIGlzIGluIHNtZS1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlICYmIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNTbWVGb3JtRmllbGQodGFyZ2V0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXZlbnQuYWx0S2V5ICYmICFldmVudC5zaGlmdEtleVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkhvbWU6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9IZWFkT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlVwQXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbCB1cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFyYml0cmFyeVNjcm9sbCh0aGlzLmRlZmF1bHRTY3JvbGxQaXhlbHMsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpID4gMCB8fCB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9QcmV2aW91c1JlbmRlcmVkSXRlbShzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IERvbS5nZXRQcmV2aW91c1pvbmVFbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkRvd25BcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Nyb2xsIGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmJpdHJhcnlTY3JvbGwodGhpcy5kZWZhdWx0U2Nyb2xsUGl4ZWxzLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2l0aCBzaGlmdEtleSBtZWFucyBuZWVkcyBzZWxlY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9OZXh0UmVuZGVyZWRJdGVtKGV2ZW50LnNoaWZ0S2V5ID8gdHJ1ZSA6IHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuUGFnZVVwOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUHJldmlvdXNQYWdlT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlBhZ2VEb3duOlxyXG4gICAgICAgICAgICAgICAgaWYgKCg8SFRNTEVsZW1lbnQ+ZXZlbnQuc3JjRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRQYWdlT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW5kOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvRW5kT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlNwYWNlOlxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW50ZXI6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRFbnRlclNwYWNlKGN1cnJlbnRSZW5kZXJlZEl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0QW5kRm9jdXMsIGV2ZW50LCB0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuTGVmdEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZExlZnRBcnJvdyhjdXJyZW50UmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50LCBjdXJyZW50Um93KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuUmlnaHRBcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRSaWdodEFycm93KGN1cnJlbnRSZW5kZXJlZEl0ZW0sIHRhcmdldEVsZW1lbnQsIGN1cnJlbnRSb3cpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgdGhlIHRyZWUgdGFibGUgbm93IHdlIGZpcnN0IGZvY3VzIGFuZCB0aGVuIHVzZSB0aGUgcmlnaHQgYXJyb3cga2V5IG9yIGVudGVyIG9yIHNwYWNlIHRvIHNlbGVjdFxyXG4gICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgbG9naWMgYmVmb3JlIGhlcmUgb25seSBkaWQgYW4gYXJyb3cgdXAvZG93biBrZXksIHdlIG5lZWQgdGhlIHNlbGVjdGlvbiBoYXBwZW5pbmcgYXMgd2VsbFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuVXBBcnJvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkRvd25BcnJvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkRlYm91bmNlVGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpIHtcclxuICAgICAgICAvLyBJZiB0cmVlIHRhYmxlIGFuZCB0aGUgY3VycmVudCBmb2N1c2VkIGVsZW1lbnQgaW5kZXggaXMgZGlmZmVyZW50IGZyb20gdGhlIHNlbGVjdGVkIG9uZVxyXG4gICAgICAgIC8vIFdpbGwgc2VsZWN0IHRoZSByb3cgYmFzZWQgb24gZm9jdXNlZCBlbGVtZW50XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCAhPT0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGtleWJvYXJkIHByZXNzIGV2ZW50IGZvciBlbnRlciBhbmQgc3BhY2VcclxuICAgICAqIFRvIHRyaWdnZXIgdGhpcyBmdW5jdGlvbiwgZWl0aGVyIGZvY3VzIG9uIHRhYmxlIHJvdyBvciB0YWJsZSByb3cgY2VsbCB0ZW1wbGF0ZSBhbmRcclxuICAgICAqIGNsaWNrIHRoZSAnZW50ZXInIG9yICdzcGFjZScgYnV0dG9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZEVudGVyU3BhY2UoY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBzZWxlY3RBbmRGb2N1czogYm9vbGVhbixcclxuICAgICAgICBldmVudDogS2V5Ym9hcmRFdmVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBpZiBmYWxzZSwgZm9jdXNlZCBvbiB0YWJsZSByb3cgY2VsbCB0ZW1wbGF0ZVxyXG4gICAgICAgIC8vIGlmIHRydWUsIGZvY3VzZWQgb24gdGFibGUgcm93IGl0ZW0gY29tcG9uZW50XHJcbiAgICAgICAgbGV0IGZvY3VzZWRPblJvd0NvbXBvbmVudCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50ICYmIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0ICYmIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpIHtcclxuICAgICAgICAgICAgZm9jdXNlZE9uUm93Q29tcG9uZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuU3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHNwYWNlIG9uIGEgZGF0YSB0YWJsZSBpcyB0byBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgICAgIC8vIE91ciBkYXRhIHRhYmxlIGJlaGF2ZXMgZXhhY3RseSB0aGUgc2FtZSBhcyB3aW5kb3dzIDEwIGZpbGUgZXhwbG9yZXJcclxuICAgICAgICAgICAgICAgIC8vIE9uIHNwYWNlL2VudGVyIHdpbGwgYm90aCBzZWxlY3QgdGhlIGN1cnJlbnQgcm93LlxyXG4gICAgICAgICAgICAgICAgLy8gU28gYWx3YXlzIGRlY2xpbmUgZGVmYXVsdCBmdW5jdGlvbiBmb3Igc3BhY2Uga2V5Ym9hcmQgZXZlbnQgYXMgbG9uZyBhcyBmb2N1cyBpcyBvbiB0aGUgcm93IGJlY2F1c2VcclxuICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBuZWVkIHRoZSBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2UgYmVoYXZpb3JcclxuICAgICAgICAgICAgICAgIGlmIChmb2N1c2VkT25Sb3dDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBJZiBLZXlDb2RlIGlzIEVudGVyLCBqdXN0IHJlbWFpbiB0aGUgY3VycmVudCB2YWx1ZSBvZiBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uXHJcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZGlzYWJsZSB0aGUgZW50ZXIga2V5IGRlZmF1bHQgZnVuY3Rpb25cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uSXRlbUNoZWNrQm94Q2xpY2tlZChjdXJyZW50UmVuZGVyZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IHNlbGVjdCBhIHJvdy4gbm90IGV4cGFuZC9jb2xsYXBzZSBpdFxyXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJldmVudEVudGVyS2V5Rm9yRGVmYXVsdEFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRvdWJsZUNsaWNrUm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2luZy5sb2coe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogTG9nTGV2ZWwuRGVidWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdObyBldmVudCBoYW5kbGVyIGJpbmQgdG8gXCJkb3VibGVDbGlja1Jvd1wiIGV2ZW50LicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ0RhdGFUYWJsZUNvbXBvbmVudC5vbkNvbnRlbnRUYWJsZVByZXNzZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RBbmRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3VibGVDbGlja1JvdyhudWxsLCBjdXJyZW50UmVuZGVyZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQua2V5Q29kZSAmJiBldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkVudGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkUmlnaHRBcnJvdyhjdXJyZW50UmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjdXJyZW50Um93OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpO1xyXG4gICAgICAgICAgICBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2N1cnJlbnRSZW5kZXJlZEl0ZW0uZGF0YV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tHcm91cFRvZ2dsZShjdXJyZW50UmVuZGVyZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICsgMTsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICsgMTsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUcmVlVGFibGVQYXJlbnROb2RlKGN1cnJlbnRSZW5kZXJlZEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGlmICghY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShudWxsLCBjdXJyZW50UmVuZGVyZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvTmV4dFJlbmRlcmVkSXRlbSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICBsZXQgcm93Rm9yTmV4dEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihuZXh0RWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgbGV0IGNlbGxGb3JOZXh0RWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKG5leHRFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtdGQnKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbEZvck5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGNlbGxGb3JOZXh0RWxlbWVudCAmJiBpIDwgY2VsbEZvck5leHRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEZvck5leHRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5baV0gPT09IGNlbGxGb3JOZXh0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCByZW1haW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoZWNrYm94IHdoZW4gaXQgaXMgZWRpdGFibGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgIXRoaXMuZWRpdGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNEYXRhVGFibGVDaGVja0JveEhUTUxFbGVtZW50KG5leHRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5leHRFbGVtZW50IGlzIHRoZSBjaGVja2JveCBpbiBmaXJzdCBjb2x1bW4sIG1vdmUgb24gdGhlIG5leHQgY2FuZGlkYXRlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQgPSBEb20uZ2V0TmV4dEZvY3VzYWJsZUVsZW1lbnQobmV4dEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Rm9yTmV4dEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEZvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ICE9PSAtMVxyXG4gICAgICAgICAgICAgICAgJiYgY3VycmVudFJvdyA9PT0gcm93Rm9yTmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNvbnRlbnRUYWJsZVByZXNzZWRMZWZ0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgY3VycmVudFJvdzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2N1cnJlbnRSZW5kZXJlZEl0ZW0uZGF0YV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tHcm91cFRvZ2dsZShjdXJyZW50UmVuZGVyZWRJdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEl0ZW0pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUcmVlVGFibGVQYXJlbnROb2RlKGN1cnJlbnRSZW5kZXJlZEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tUcmVlVG9nZ2xlKGV2ZW50LCBjdXJyZW50UmVuZGVyZWRJdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhdLm5vZGUucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSA9PT0gcGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0UHJldmlvdXNGb2N1c2FibGVFbGVtZW50KHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCByb3dGb3JQcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgY29uc3QgY2VsbEZvclByZXZpb3VzRWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKFxyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtdGQnKSk7XHJcbiAgICAgICAgICAgIGlmIChjZWxsRm9yUHJldmlvdXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQgJiYgaSA8IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsRm9yUHJldmlvdXNFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5baV0gPT09IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgcHJldmlvdXNFbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHByZXZpb3VzRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLWNoZWNrYm94JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91c0VsZW1lbnQgaXMgdGhlIGNoZWNrYm94IGlzIGluIHRoZSBmaXJzdCBjb2x1bW4sIHRoZW4gc2tpcCBpdCwgZGlyZWN0bHkgZ28gdG8gdGhlIHJvdy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCA9IHJvd0ZvclByZXZpb3VzRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCA9PT0gY3VycmVudFJvdyB8fCByb3dGb3JQcmV2aW91c0VsZW1lbnQgIT09IGN1cnJlbnRSb3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJvd0ZvclByZXZpb3VzRWxlbWVudCA9PT0gY3VycmVudFJvdykge1xyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVHJlZVRhYmxlUGFyZW50Tm9kZSh0cmVlTm9kZUl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0cmVlTm9kZUl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZSAmJiAhdHJlZU5vZGVJdGVtLm5vZGUuaXNMZWFmO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRJdGVtRm9jdXNlZChldmVudDogRm9jdXNFdmVudCwgcmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRBcmVhSGFzRm9jdXMgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5lZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzID0gZWRpdGFibGVEYXRhSXRlbS5pc05ld1JvdztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRkRWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKFxyXG4gICAgICAgICAgICAgICAgPEhUTUxFbGVtZW50PmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS10ZCcpKTtcclxuICAgICAgICAgICAgY29uc3QgdHJFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IodGRFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpO1xyXG4gICAgICAgICAgICBpZiAodHJFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZEVsZW1lbnRzID0gdHJFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtdGQnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gLTE7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRkRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGRFbGVtZW50c1tpXSA9PT0gdGRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuZm9jdXNJblRhYmxlQ2VsbChldmVudCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50SXRlbUJsdXJyZWQoZXZlbnQsIHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmZvY3VzT3V0VGFibGVDZWxsKGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlbmRlcmVkSXRlbVJvd0ZvY3VzT3V0KHJlbmRlcmVkSXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlRWRpdGFibGVEYXRhUm93KGRhdGE6IGFueSkge1xyXG4gICAgICAgIGxldCBkYXRhRXhpc3RzSW5JbnRlcm5hbEl0ZW1zID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmludGVybmFsSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnRoaXMuaW50ZXJuYWxJdGVtc1tpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uY29udGVudCA9PT0gZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YUV4aXN0c0luSW50ZXJuYWxJdGVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgZm91bmRJbkFkZGVkSXRlbXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC5hZGRlZEl0ZW1zW2pdID09PSBpdGVtLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5BZGRlZEl0ZW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC51cGRhdGVkSXRlbXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zW2pdID09PSBpdGVtLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLnNwbGljZShqLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghZm91bmRJbkFkZGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC5kZWxldGVkSXRlbXMucHVzaChpdGVtLmNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEl0ZW1zLnNwbGljZShpLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJvdyBub3QgeWV0IGFkZGVkIHRvIGludGVybmFsSXRlbXMsIGp1c3QgcmVmcmVzaFxyXG4gICAgICAgIGlmICghZGF0YUV4aXN0c0luSW50ZXJuYWxJdGVtcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25MYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzZWQoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c09uY2UgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2VuZXJhdGVOR0NsYXNzRm9yUmVuZGVyZWRJdGVtKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYW55IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZDogcmVuZGVyZWRJdGVtLmluZGV4ID09PSB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCksXHJcbiAgICAgICAgICAgICdzbWUtdGFibGUtZ3JvdXAtaXRlbSc6IHJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSXRlbSxcclxuICAgICAgICAgICAgJ3NtZS10YWJsZS1ncm91cC1oZWFkZXInOiByZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcixcclxuICAgICAgICAgICAgJ3NtZS1jaGVja2VkJzogdGhpcy5pc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zZWxlY3Rpb24gJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGlvbi5sZW5ndGggPT09IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmVlTm9kZURhdGFJdGVtID0gPFRyZWVOb2RlRGF0YUl0ZW0+dGhpcy5maWx0ZXJlZEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdHJlZU5vZGVEYXRhSXRlbSB8fCAhdHJlZU5vZGVEYXRhSXRlbS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRIb3ZlcmVkUmVuZGVyZWRJdGVtKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPSByZW5kZXJlZEl0ZW0uaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVuc2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleCA9PT0gcmVuZGVyZWRJdGVtLmluZGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50JykpIHtcclxuICAgICAgICAgICAgaXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlUmVuZGVyZWRJdGVtUm93Rm9jdXNPdXQocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgICAgIGlmIChlZGl0YWJsZURhdGFJdGVtLmlzTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2hvdWxkQWRkTmV3Um93ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIGhhbmRsZSBpZiBhbnkgZm9ybSBmaWVsZCBpcyBkaXJ0eSB0aGVuIHZhbGlkYXRlXHJcbiAgICAgICAgICAgICAgICBsZXQgYXRMZWFzdE9uZUZpZWxkRGlydHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnRzLmZvckVhY2gobG9hZGVyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRDb250YWluZXIgPSA8Rm9ybUZpZWxkQ29udGFpbmVyPmxvYWRlcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyLnJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZXJEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPmxvYWRlci5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlckRhdGFJdGVtLmlzTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUZpZWxkQ29udGFpbmVyLmlzRGlydHkoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TGVhc3RPbmVGaWVsZERpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBhbHNvIGhhbmRsZSB3aGVuIGZvY3VzaW5nIG91dCBmcm9tIHRoZSBsYXN0IGZvcm0gZmllbGQgaW4gdGhlIHJvd1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkID0gdGhpcy5nZXRJc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdE9uZUZpZWxkRGlydHkgfHwgaXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkTmV3Um93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50cy5mb3JFYWNoKGxvYWRlciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZENvbnRhaW5lciA9IDxGb3JtRmllbGRDb250YWluZXI+bG9hZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyLnJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVyRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5sb2FkZXIucmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyRGF0YUl0ZW0uaXNOZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1GaWVsZENvbnRhaW5lci5jaGVja1ZhbGlkYXRpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGROZXdSb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQWRkTmV3Um93ICYmIHRoaXMuZWRpdGFibGVBdXRvTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0RhdGFJdGVtID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGVOZXdEYXRhSGFuZGxlciA9IGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhSXRlbSA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlUm93QWRkZWQuZW1pdCh7IGRhdGE6IG5ld0RhdGFJdGVtLCBvdmVycmlkZU5ld0RhdGFIYW5kbGVyOiBvdmVycmlkZU5ld0RhdGFIYW5kbGVyIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQgPSBuZXdEYXRhSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW0uZGF0YS5pc05ld1JvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcy5wdXNoKHJlbmRlcmVkSXRlbS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC5hZGRlZEl0ZW1zLnB1c2gobmV3RGF0YUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlc2V0VXBkYXRlZC5lbWl0KHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEl0ZW1zLnB1c2gobmV3RGF0YUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvdWxkU2hvd0VkaXRSb3cocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5pc0FsbEVkaXRhYmxlUm93c1Zpc2libGUpIHsgcmV0dXJuIHRydWU7IH1cclxuXHJcbiAgICAgICAgY29uc3QgZWRpdGFibGVEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgIHJldHVybiByZW5kZXJlZEl0ZW0uaW5kZXggPT09IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKVxyXG4gICAgICAgICAgICB8fCB0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcihyZW5kZXJlZEl0ZW0pXHJcbiAgICAgICAgICAgIHx8IHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5ob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXhcclxuICAgICAgICAgICAgfHwgZWRpdGFibGVEYXRhSXRlbS5pc05ld1JvdztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFyaWEtbGFiZWwgZm9yIGNvbHVtbiBzb3J0IG9yZGVyIChpZiBzb3J0YWJsZSkuXHJcbiAgICAgKiBUaGlzIGxhYmVsIGlzIHV0aWxpemVkIGJ5IHNjcmVlbiByZWFkZXJzIGZvciBhY2Nlc3NpYmlsaXR5LlxyXG4gICAgICogSWYgdGhlIGN1cnJlbnQgc29ydCBvcmRlciBpcyBBc2NlbmRpbmcsIHRoZSBsYWJlbCB3aWxsIGluZGljYXRlIGEgYnV0dG9uIGljb24gaXMgcHJlc2VudCB0byBEZXNjZW5kIG9yZGVyLlxyXG4gICAgICogSWYgdGhlIGN1cnJlbnQgc29ydCBvcmRlciBpcyBEZXNjZW5kaW5nLCB0aGUgbGFiZWwgd2lsbCBpbmRpY2F0ZSBhIGJ1dHRvbiBpY29uIGlzIHByZXNlbnQgdG8gQXNjZW5kIG9yZGVyLlxyXG4gICAgICogSWYgdGhlIGN1cnJlbnQgc29ydCBvcmRlciBpcyBOb25lLCB0aGUgbGFiZWwgaXMgbnVsbCwgYW5kIHRoZSBzY3JlZW4gcmVhZGVyIHdpbGwgbm90IHJlYWQgYW55dGhpbmcuXHJcbiAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSB0YWJsZSBjb2x1bW5cclxuICAgICAqIEByZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgYXJpYS1sYWJlbCBvbiB0aGUgc29ydCBpY29uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTb3J0TGFiZWwoY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAoY29sdW1uLnNvcnRNb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlU29ydE1vZGUuQXNjZW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuQXJpYS5MYWJlbC5kZXNjZW5kU29ydE9yZGVyQnV0dG9uO1xyXG4gICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLkRlc2NlbmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5BcmlhLkxhYmVsLmFzY2VuZFNvcnRPcmRlckJ1dHRvbjtcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW1wbGVtZW50cyB0aGUgQWZ0ZXJWaWV3SW5pdCBpbnRlcmZhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVTY3JvbGxiYXJXaWR0aCgpO1xyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxIYW5kbGVyID0gKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGVkRG93biA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA+IDA7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2Nyb2xsZWREb3duKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxhenkgbG9hZGluZyBpcyBlbmFibGVkLCByZWR1Y2UgdGhlIGZyZXFlbmN5IG9mIGhhbmRsaW5nIHNjcm9sbGluZ1xyXG4gICAgICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBkb2luZyB0aGUgZGF0YSBsYXp5IGxvYWRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmdFdmVudEhhbmRsZXJTZXR1cCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbENoZWNrSW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTY3JvbGxpbmdFdmVudEhhbmRsZXJTZXR1cCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbER1cmF0aW9uKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuZXZlbnRVbnJlZ2lzdHJhdGVySGFuZGxlcnMucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRpYWxpemVVSSgpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tJbW1lZGlhdGVWYWxpZGF0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgY2hlY2tJbW1lZGlhdGVWYWxpZGF0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnRzLmZvckVhY2gobG9hZGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZENvbnRhaW5lciA9IDxGb3JtRmllbGRDb250YWluZXI+bG9hZGVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvYWRlci5yZW5kZXJlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGRDb250YWluZXIuaW1tZWRpYXRlVmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbXBsZW1lbnRzIHRoZSBPbkRlc3Ryb3kgaW50ZXJmYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbCk7XHJcbiAgICAgICAgdGhpcy5ldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVycy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlcikge1xyXG4gICAgICAgICAgICB0aGlzLnVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5sYXlvdXRDaGFuZ2VTdWJzY3JpYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q2hhbmdlU3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXJTdWJzY3JpYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyU3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGltcGxlbWVudHMgdGhlIEFmdGVyVmlld0NoZWNrZWQgaW50ZXJmYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3Q2hlY2tlZCgpO1xyXG4gICAgICAgIHRoaXMuYWxpZ25Db250ZW50KCk7XHJcbiAgICAgICAgdGhpcy5hbGlnblNjcm9sbEJhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgc2VsZWN0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHRhYmxlIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG11bHRpcGxlU2VsZWN0TW9kZSA9IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5Ob3JtYWw7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZVNlbGVjdE1vZGUgPSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuUGljaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlU2VsZWN0TW9kZSA9IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5TZXF1ZW50aWFsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGUgJiYgKDxIVE1MRWxlbWVudD5ldmVudC5zcmNFbGVtZW50KS50YWdOYW1lID09PSAnSU5QVVQnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpdGVtID8gaXRlbS5pbmRleCA6IC0xKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlICE9PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0Wyd0eXBlJ10gPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGl0ZW0ubm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RBbmRDaGVjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk5vcm1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChjdXJyZW50SXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY3VycmVudEl0ZW0sIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsIHRydWUsIGZhbHNlLCAhdGhpcy5saW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVTZWxlY3RlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5QaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsICFpdGVtLm5vZGUuc2VsZWN0ZWQsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNlcXVlbnRpYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLXVzZXItc2VsZWN0LW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICE9PSAtMSAmJiB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbmRleCA8IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpdGVtLmluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBhIGJ1ZyB0aGF0IHRyZWUgdGFibGUgbXVsdGlwbGUgc2VsZWN0aW9uIHdpbGwgbG9zdCBmb2N1c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RQYXJlbnQ6IFRyZWVOb2RlRGF0YUl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXJlbnQgPSB0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVuZCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbih0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSwgZmFsc2UsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0QW5kQ2hlY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5QaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkl0ZW1DaGVja0JveENsaWNrZWQoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5TZXF1ZW50aWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWUtdXNlci1zZWxlY3Qtbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCAhPT0gLTEgJiYgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLnByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpdGVtLmluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbmRleCA8IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlICE9PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkl0ZW1DaGVja0JveENsaWNrZWQodGhpcy5yZW5kZXJlZEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gW2l0ZW0uZGF0YV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLmVkaXRhYmxlID8gaXRlbS5kYXRhLmNvbnRlbnQgOiBpdGVtLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IHRoaXMuZWRpdGFibGUgPyBpdGVtLmRhdGEuY29udGVudCA6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudCAmJiAhRG9tLmlzRm9jdXNhYmxlKDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZnVuY3Rpb24gdG8gZm9jdXMgb24gZW1wdHkgbWVzc2FnZSB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIGVtcHR5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZSgpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5lbXB0eU1lc3NhZ2VFbGVtZW50ICYmIHRoaXMuZW1wdHlNZXNzYWdlRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGl0ZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQgJiYgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50ICYmIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRUcnlUb0ZvY3VzRW1wdHlNZXNzYWdlQ291bnQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRlZmVycmVkVHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHJpdmF0ZSBkZWZlcnJlZFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKSB7XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzRW1wdHlNZXNzYWdlQ291bnQtLTtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0VHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50KCkge1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50ID0gMztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJldHVybnMgdGhlIG5vIHJlY29yZHMgbWVzc2FnZSB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIGVtcHR5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Tm9SZWNvcmRzTWVzc2FnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vUmVjb3JkTWVzc2FnZSB8fCB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLk5vUmVjb3Jkc0ZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvLCBvciBub3QgdG8gc2hvdyB0aGUgTm8tUmVjb3JkcyBNZXNzYWdlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd05vUmVjb3Jkc01lc3NhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoID09PSAwICYmICF0aGlzLmxhenlMb2FkKSB8fCAhdGhpcy5pc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCB8fFxyXG4gICAgICAgICAgICAodGhpcy5sYXp5TG9hZCAmJiB0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoID09PSAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGJlaGF2aW9yIHRoYXQgd2hlbiBhIGdyb3VwIHRvZ2dsZSBpcyBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tHcm91cFRvZ2dsZShpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGl0ZW0uaW5kZXgpO1xyXG4gICAgICAgIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbaXRlbS5kYXRhXSA9IHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSAhPT0gdW5kZWZpbmVkID9cclxuICAgICAgICAgICAgdG9nZ2xlU3RhdHVzT3ZlcnJpZGRlblZhbHVlIDogIXRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbaXRlbS5kYXRhXTtcclxuICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlQ2xpY2suZW1pdChpdGVtLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBiZWhhdmlvciB0aGF0IHdoZW4gYSB0cmVlIG5vZGUgdG9nZ2xlIGlzIGNsaWNrZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGlja1RyZWVUb2dnbGUoZXZlbnQ6IEV2ZW50LCBpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaXNUcmVlTm9kZUNvbGxhcHNpbmcgPSBmYWxzZTtcclxuICAgICAgICBpdGVtLm5vZGUuZXhwYW5kZWQgPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/IHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICFpdGVtLm5vZGUuZXhwYW5kZWQ7XHJcbiAgICAgICAgaWYgKGl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVFeHBhbmRlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZUNvbGxhcHNlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgICAgICBpc1RyZWVOb2RlQ29sbGFwc2luZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0VHJlZU5vZGVEYXRhSWRlbnRpdHkoaXRlbS5ub2RlKTtcclxuICAgICAgICB0aGlzLnRyZWVUb2dnbGVTdGF0dXNbaWRlbnRpdHldID0gaXRlbS5ub2RlLmV4cGFuZGVkO1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIG5vZGUncyBwYXJlbnQgaXMgY29sbGFwc2luZywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFjdGl2ZSByZW5kZXJlZCBpdGVtIGluZGV4LlxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRyZWVOb2RlUGFyZW50Q29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNUcmVlTm9kZUNvbGxhcHNpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyZWVUYWJsZUNvbGxhcHNlSGFuZGxlcihpdGVtLm5vZGUsIHRoaXMuc2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVHJlZU5vZGVQYXJlbnRDb2xsYXBzZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGV4cGFuZHMgYWxsIHRoZSBncm91cHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleHBhbmRBbGxHcm91cCgpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXMuaGFzT3duUHJvcGVydHkoZ3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBjb2xsYXBzZXMgYWxsIHRoZSBncm91cHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xsYXBzZUFsbEdyb3VwKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgaW4gdGhpcy5ncm91cFRvZ2dsZVN0YXR1cykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1cy5oYXNPd25Qcm9wZXJ0eShncm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBdID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGdpdmVuIGNvbHVtbiBpcyB0aGUgZmlyc3QgZGF0YSBjb2x1bW4uXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQgdG8gYWRkIHNvbWUgY3VzdG9tIGNzcyBmb3IgdGhlIGZpcnN0IGRhdGEgY29sdW1uIHdoZW4gZ3JvdXBpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGZpcnN0RGF0YUNvbHVtbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY3VycmVudENvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFmaXJzdERhdGFDb2x1bW4gJiYgIWN1cnJlbnRDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdERhdGFDb2x1bW4gPSBjdXJyZW50Q29sdW1uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb2x1bW4gPT09IGZpcnN0RGF0YUNvbHVtbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBpZCBpZiB0aGUgY29sdW1uIGlzIHRoZSBmaXJzdCBhbmQgcmVuZGVyZWQgaXRlbSBoYXMgYSB2YWxpZCBpbmRleCwgb3RoZXJ3aXNlIHJldHVybiBudWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGaXJzdENvbHVtbklkKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pIHx8XHJcbiAgICAgICAgICAgICEocmVuZGVyZWRJdGVtICYmIE51bWJlci5pc0ludGVnZXIocmVuZGVyZWRJdGVtLmluZGV4KSAmJiByZW5kZXJlZEl0ZW0uaW5kZXggPj0gMCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5pZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29sdW1uUmVzaXppbmcoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc21lLWxheW91dC1ub25lJyk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGV2ZW50LnggKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6ZWQoY29sdW1uSW5kZXg6IG51bWJlciwgZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWUtbGF5b3V0LW5vbmUnKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sdW1uSGVhZGVyRWxlbWVudHMgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtY29sdW1uLWhlYWRlcicpO1xyXG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbldpZHRoczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBuZXdDb2x1bW5XaWR0aHMucHVzaChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCk7XHJcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUaGUgcmVzaXplciBpcyBhdCB0aGUgcmlnaHQgYm9yZGVyIG9mIHRoZSBjdXJyZW50IGNvbHVtbi5cclxuICAgICAgICAvLyBXaGVuIHRoZSByZXNpemluZyBoYXBwZW5zLCBpdCBtZWFucyByZXNpemluZyB0aGUgY3VycmVudCBjb2x1bW4gd2l0aCBkZWx0YSBhbW91bnRcclxuICAgICAgICAvLyBhbmQgcmVzaXppbmcgdGhlIG5leHQgY29sdW1uIHdpdGggLWRlbHRhIGFtb3VudC5cclxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4XTtcclxuICAgICAgICBsZXQgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGggKyBldmVudC54O1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbmV4dENvbHVtbkhlYWRlciBpcyBoaWRkZW4sIHRoYXQgbWVhbnMgaXQncyBhIGdyb3VwIGNvbHVtbiBoZWFkZXIgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbi5cclxuICAgICAgICAvLyBBIGhpZGRlbiBncm91cCBoZWFkZXIncyB3aWR0aCBzaG91bGQgbm90IGJlIGNvdW50ZWQuXHJcbiAgICAgICAgLy8gVGhlbiBzZXQgdGhlIG5leHRDb2x1bW5JbmRleCB0byB0aGUgbmV4dCBuZXh0IGNvbHVtbidzIGluZGV4LlxyXG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4ICsgKGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4ICsgMV0uaGFzQXR0cmlidXRlKCdoaWRkZW4nKSA/IDIgOiAxKTtcclxuICAgICAgICBjb25zdCBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW25leHRDb2x1bW5JbmRleF07XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IG5leHRDb2x1bW5IZWFkZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gZXZlbnQueDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiBpcyBsZXNzIHRoZW4gbWluQ29sdW1uV2lkdGgsIGl0IG1lYW5zIHRoZSB1c2VyIGlzIHRyeWluZyB0byBkcmFnIHRoZSByZXNpemVyIHRvIHZlcnkgbGVmdFxyXG4gICAgICAgIC8vIHRvIG1ha2UgdGhlIG5leHQgY29sdW1uIHZlcnkgd2lkZS5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQgdG8gYXMgd2lkZSBhcyB0aGUgdXNlciB3YW50cy5cclxuICAgICAgICAvLyBUaGUgbGVmdCBzaWRlIGNvbHVtbnMgb2YgdGhlIG5leHQgY29sdW1uIHdpbGwgYmUgc2hydW5rIGJhc2VkIG9uIHRoZWlyIG93biBvcmlnaW5hbCBwZXJjZW50YWdlIHdpZHRoLlxyXG4gICAgICAgIGlmIChuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW4gPCBEYXRhVGFibGVDb21wb25lbnQubWluQ29sdW1uV2lkdGgpIHtcclxuICAgICAgICAgICAgbGV0IGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5leHRDb2x1bW5JbmRleCArIDE7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSB0b3RhbFdpZHRoIC0gY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgLSBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSB0b3RhbFdpZHRoIC0gY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgLSBuZXdXaWR0aEZvck5leHRDb2x1bW47XHJcblxyXG4gICAgICAgICAgICBsZXQgYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBjb2x1bW5JbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb2x1bW5XaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zICogKGNvbHVtbkhlYWRlckVsZW1lbnRzW2ldLm9mZnNldFdpZHRoIC8gb3JpZ2luYWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKTtcclxuICAgICAgICAgICAgICAgIG5ld0NvbHVtbldpZHRoc1tpXSA9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICAgICAgYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgKz0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gbmV3Q29sdW1uV2lkdGhzW2NvbHVtbkluZGV4XTtcclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JOZXh0Q29sdW1uID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zIC0gYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbmV3V2lkdGhGb3JOZXh0Q29sdW1uIGlzIGxlc3MgdGhlbiBtaW5Db2x1bW5XaWR0aCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGRyYWcgdGhlIHJlc2l6ZXIgdG8gdmVyeSByaWdodFxyXG4gICAgICAgIC8vIHRvIG1ha2UgdGhlIGN1cnJlbnQgY29sdW1uIHZlcnkgd2lkZS5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQgdG8gYXMgd2lkZSBhcyB0aGUgdXNlciB3YW50cy5cclxuICAgICAgICAvLyBUaGUgcmlnaHQgc2lkZSBjb2x1bW5zIG9mIHRoZSBjdXJyZW50IGNvbHVtbiB3aWxsIGJlIHNocnVuayBiYXNlZCBvbiB0aGVpciBvd24gb3JpZ2luYWwgcGVyY2VudGFnZSB3aWR0aC5cclxuICAgICAgICBpZiAobmV3V2lkdGhGb3JOZXh0Q29sdW1uIDwgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY29sdW1uSW5kZXggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBjdXJyZW50Q29sdW1uSGVhZGVyRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW47XHJcblxyXG4gICAgICAgICAgICBsZXQgYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5leHRDb2x1bW5JbmRleDsgaSA8IGNvbHVtbkhlYWRlckVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb2x1bW5XaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyAqIChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCAvIG9yaWdpbmFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zKSxcclxuICAgICAgICAgICAgICAgICAgICBEYXRhVGFibGVDb21wb25lbnQubWluQ29sdW1uV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgbmV3Q29sdW1uV2lkdGhzW2ldID0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnMgKz0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBhY3R1YWxXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnM7XHJcbiAgICAgICAgICAgIG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IG5ld0NvbHVtbldpZHRoc1tuZXh0Q29sdW1uSW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV3Q29sdW1uV2lkdGhzW2NvbHVtbkluZGV4XSA9IG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbjtcclxuICAgICAgICBuZXdDb2x1bW5XaWR0aHNbbmV4dENvbHVtbkluZGV4XSA9IG5ld1dpZHRoRm9yTmV4dENvbHVtbjtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlcyB0aGUgY29sdW1uIHdpZHRocyBiYXNlZCBvbiB0aGUgY2FsY3VsYXRpb24gcmVzdWx0cy5cclxuICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbHVtbi53aWR0aCA9IG5ld0NvbHVtbldpZHRoc1tpbmRleF0gKyAncHgnO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbHVtbiBwZXJjZW50YWdlcyBiYXNlZCBvbiB0aGUgbmV3IGNvbHVtbiB3aWR0aHMuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgPSBjb2x1bW5IZWFkZXJFbGVtZW50c1tpbmRleF0ub2Zmc2V0V2lkdGggLyB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgY29sdW1uIGNsaWNraW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tDb2x1bW4oY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb2x1bW5Tb3J0U2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRhYmxlICE9PSAnZmFsc2UnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gY29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLk5vbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuRGVzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuQXNjZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c1NvcnRDb2x1bW4gPSB0aGlzLnNvcnRDb2x1bW47XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0Q29sdW1uID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZFNjcm9sbFRvU2VsZWN0aW9uQWZ0ZXJTb3J0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5oZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGhbZmllbGQ9XCInICsgY29sdW1uLmZpZWxkICsgJ1wiXScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RyJykuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjAwIGlzIGEgdmVyeSB0cmlja3kgbnVtYmVyIGhlcmUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXMgdG9vIHNtYWxsLCBpdCB3b24ndCB0cmlnZ2VyIHRoZSBuYXJyYXRvci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyB0b28gYmlnLCB0aGUgbmFycmF0b3Igd291bGQgZmlyc3RseSByZWFkIHRoZSBjb250ZW50IG9mIFRSIHBhcnRpYWxseSB0aGVuIHRoZSBjb250ZW50IG9mIHRoZSBUSC5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc29ydE1vZGUgPSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb2x1bW5Tb3J0U2V0dGluZ3NbaXRlbS5oZWFkZXJdID0gdGhpcy5nZXRBcmlhU29ydEF0dHJpYnV0ZVZhbHVlKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbHVtblNvcnRTZXR0aW5ncyA9IGNvbHVtblNvcnRTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIHJvdyBkb3VibGUgY2xpY2tpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkb3VibGVDbGlja1JvdyhldmVudDogTW91c2VFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgaXRlbSk7XHJcbiAgICAgICAgdGhpcy5yb3dEYmxjbGljay5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgc2Nyb2xscyB0aGUgc2VsZWN0ZWQgaXRlbSBpbnRvIHRoZSB2aWV3IGFuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ5VG9Nb3ZlVG9DZW50ZXI/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGlvbkRhdGEgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5zZWxlY3Rpb24uZGF0YTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRGF0YSA9IHRoaXMuc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRGF0YSA9IHRoaXMuc2VsZWN0aW9uWzBdLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRGF0YSA9IHRoaXMuc2VsZWN0aW9uWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0aW9uRGF0YSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEgPT09IHNlbGVjdGlvbkRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJ5VG9Nb3ZlVG9DZW50ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJFbGVtZW50ID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxEYXRhRWxlbWVudCA9IHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbUVsZW1lbnQgPSBzY3JvbGxEYXRhRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc21lLXRhYmxlLXJvdy5zbWUtdGFibGUtcm93LXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbVRvcCA9IHNlbGVjdGVkSXRlbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2Nyb2xsRGF0YUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wID0gc2VsZWN0ZWRJdGVtVG9wICsgc2Nyb2xsRGF0YUVsZW1lbnQub2Zmc2V0VG9wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgY2xpY2tpbmcgYmVoYXZpb3Igb2YgY2hlY2tib3guXHJcbiAgICAgKiBNdWx0aXBsZSBzZWxlY3Rpb24gYmVoYXZpb3IgaXMgaGFwcGVuaW5nIGhlcmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkl0ZW1DaGVja0JveENsaWNrZWQoaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBpc0Zyb21LZXlib2FyZD86IGJvb2xlYW4pIHtcclxuICAgICAgICAvLyBJZiB0aGUgaXRlbSBpcyB1bmNoZWNrZWQsIG5lZWQgdG8gc2V0IGFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IHRvIC0xIHRoZW4gdGhpcyBpdGVtIHdvbid0IGJlIGhpZ2hsaWdodGVkIGluIHRoZSBVSS5cclxuICAgICAgICBpZiAoaXRlbS50eXBlICE9PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oaXRlbS5ub2RlLCAhaXRlbS5ub2RlLnNlbGVjdGVkLCBmYWxzZSwgIXRoaXMubGlua1BhcmVudENoaWxkcmVuU2VsZWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5ub2RlLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zyb21LZXlib2FyZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlICYmICF0aGlzLmVkaXRhYmxlICYmIHRoaXMuZXhwYW5kVHJlZU5vZGVPbkNoZWNrZWQgJiYgaXRlbS5oYXNDaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tUcmVlVG9nZ2xlKG51bGwsIGl0ZW0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2YoaXRlbS5kYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnB1c2goaXRlbS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1Vuc2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRnJvbUtleWJvYXJkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoLTEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtKTtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtcyA9IHRoaXMuZmlsdGVyZWRJdGVtcy5maWx0ZXIoY3VycmVudEl0ZW0gPT5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoY3VycmVudEl0ZW0sIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpID09PSBpdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5pbmRleE9mKGdyb3VwSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93VW5zZWxlY3RlZC5lbWl0KHsgZGF0YTogZ3JvdXBJdGVtc1tpXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5wdXNoKGdyb3VwSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiBncm91cEl0ZW1zW2ldIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFzZWxlY3RlZCAmJiAhaXNGcm9tS2V5Ym9hcmQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoLTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOZWVkIHRvIHJlY3JlYXRlIHRoZSBcImludGVybmFsU2VsZWN0aW9uXCIgYXJyYXkgb3RoZXJ3aXNlIHRoZSBjaGFuZ2UgZGV0ZWN0b3Igd29uJ3QgZGV0ZWN0IHRoZSBjaGFuZ2VcclxuICAgICAgICAvLyBzaW5jZSB0aGUgYXJyYXkncyBvd24gcmVmZXJlbmNlIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLnNsaWNlKDAsIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmludGVybmFsU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIFwiY2hlY2sgYWxsXCIgY2hlY2tib3ggYmVoYXZpb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkFsbEl0ZW1DaGVja0JveENsaWNrZWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubGVuZ3RoICE9PSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFsbCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1Vuc2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0gfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRTZWxlY3QgPSAhdGhpcy5zaG91bGRBbGxJdGVtQ2hlY2tCb3hDaGVja2VkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGl0ZW0sIHNob3VsZFNlbGVjdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBpdGVtIGlzIHNlbGVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJdGVtU2VsZWN0ZWQoaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLmRhdGEgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5pbmRleE9mKGl0ZW0uZGF0YSkgIT09IC0xO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbHRlcihjdXJyZW50SXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGN1cnJlbnRJdGVtLCB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKSA9PT0gaXRlbS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBpdGVtLmRhdGEgPT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihncm91cEl0ZW1zW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLm5vZGUgJiYgaXRlbS5ub2RlLnNlbGVjdGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLmRhdGEgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5tYXAoY3VycmVudEl0ZW0gPT4gY3VycmVudEl0ZW0uZGF0YSkuaW5kZXhPZihpdGVtLmRhdGEpICE9PSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgYSBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIGV4cGFuZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNHcm91cEV4cGFuZGVkKGdyb3VwOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSB2aXJ0dWFsIGNvdW50LlxyXG4gICAgICogSXQgb25seSB3b3JrcyB3aGVuIFwibGF6eUxvYWRcIiBpcyB0cnVlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCB2aXJ0dWFsQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCB8fCB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHZpcnR1YWxDb3VudCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID49IDApIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcyA9IEFycmF5KHZhbHVlKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zW2ldID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJlc29sdmVzIHRoZSBvYmplY3QgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGF0aCB3aXRoIG11bHRpcGxlIGxldmVscyBvZiBwcm9wZXJ0aWVzLlxyXG4gICAgICogQW4gZXhhbXBsZSBvZiBwYXRoIGlzIFwibG9jYXRpb24uemlwQ29kZVwiLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzb2x2ZU9iamVjdFBhdGgob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgaWYgKG9iaiAmJiBwYXRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTZWdtZW50czogc3RyaW5nW10gPSBwYXRoLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgICAgIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW3BhdGhdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY3VycmVudE9iaiA9IG9iajtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRPYmogPSBjdXJyZW50T2JqW3BhdGhTZWdtZW50c1tpXV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9iaiA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRPYmogPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudE9iajtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmV0dXJucyB0aGUgYWN0aXZlIHJlbmRlcmVkIGl0ZW0gaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaW5wdXQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSBpbnB1dCA+PSAwID8gaW5wdXQgOiAtMTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmV0dXJucyB0aGUgYWN0aXZlIGZvY3VzZWQgaXRlbSBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID4gLTEgPyB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggOiB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgoaW5kZXg6IG51bWJlciwgZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRhYmxlIGNlbGwgaXRlbS5cclxuICAgICAqIEBwYXJhbSByb3dJbmRleCBUaGUgcm93IGluZGV4IGZvciBnZXR0aW5nIGFsbCB0aGUgdGFibGUgY2VsbHNcclxuICAgICAqIEByZXR1cm5zIHRoZSBIVE1MIGVsZW1lbnQgZm9yIHRoZSB0YWJsZSBjZWxsLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VGFibGVDZWxscyhyb3dJbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGNlbGxzID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXHJcbiAgICAgICAgICAgIGAuc21lLXRhYmxlLWNvbnRhaW5lciBkaXZbcm9sZT1cInJvd2dyb3VwXCJdIGRpdi5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YS5zbWUtdGFibGUtcm93LXNlbGVjdGFibGVbZGF0YS1yZW5kZXJlZC1pdGVtLWluZGV4PVwiJHtyb3dJbmRleH1cIl0gZGl2W3JvbGU9XCJncmlkY2VsbFwiXSAuc21lLXRhYmxlLWNlbGxgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNlbGxzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gaGVhZCBvZiB0aGUgd2hvbGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvSGVhZE9mUmVuZGVyZWRJdGVtcyhkb1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KDAsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vdmVUb1ByZXZpb3VzUGFnZU9mUmVuZGVyZWRJdGVtcyhkb1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGRvU2VsZWN0aW9uID8gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIDogdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk7XHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4IC0gTWF0aC5yb3VuZCh0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleChuZXdJbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gcHJldmlvdXMgaXRlbSBpbiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvUHJldmlvdXNSZW5kZXJlZEl0ZW0oZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG5cclxuICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXggLSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleChuZXdJbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gbmV4dCBpdGVtIGluIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKiBAcGFyYW0gZG9TZWxlY3Rpb24gaWYgdHJ1ZSB3aWxsIGRvIHNlbGVjdGlvbiBhbmQgZm9jdXMsIG90aGVyd2lzZSBmb2N1cyBvbmx5XHJcbiAgICAgKi9cclxuXHJcbiAgICBwdWJsaWMgbW92ZVRvTmV4dFJlbmRlcmVkSXRlbShkb1NlbGVjdGlvbiA9IHRydWUsIGNvbHVtbkluZGV4PzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gZG9TZWxlY3Rpb24gPyB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbHVtbkluZGV4KSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gY29sdW1uSW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXggKyAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleChuZXdJbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gbmV4dCBwYWdlIG9mIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9OZXh0UGFnZU9mUmVuZGVyZWRJdGVtcyhkb1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGRvU2VsZWN0aW9uID8gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIDogdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk7XHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBuZXdJbmRleCA9IGluZGV4ICsgTWF0aC5yb3VuZCh0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KG5ld0luZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBlbmQgb2YgdGhlIHdob2xlIHJlbmRlcmVkIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9FbmRPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleCh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGUgdGhlIHJlbmRlcmVkIGl0ZW0gYnkgY29uZGl0aW9uLlxyXG4gICAgICogQWN0aXZhdGUgZG9lc24ndCBtZWFuIHNlbGVjdC4gSXQganVzdCBpbmRpY2F0ZXMgd2hpY2ggaXRlbSBpcyBhY3RpdmUgdG8gcmVjZWl2ZWQgbW9yZSBvcGVyYXRpb25zIGVzcGVjaWFsbHkga2V5Ym9hcmQgb3BlcmF0aW9ucy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlUmVuZGVyZWRJdGVtQnlDb25kaXRpb24oY29uZGl0aW9uOiAoaXRlbTogRGF0YVRhYmxlRGF0YUl0ZW0pID0+IGJvb2xlYW4sIGRvU2VsZWN0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbih0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMucmVuZGVyZWRJdGVtc1tpXS5pbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3RpdmF0ZSB0aGUgcmVuZGVyZWQgaXRlbSBieSBpbmRleC5cclxuICAgICAqIEFjdGl2YXRlIGRvZXNuJ3QgbWVhbiBzZWxlY3QuIEl0IGp1c3QgaW5kaWNhdGVzIHdoaWNoIGl0ZW0gaXMgYWN0aXZlIHRvIHJlY2VpdmVkIG1vcmUgb3BlcmF0aW9ucyBlc3BlY2lhbGx5IGtleWJvYXJkIG9wZXJhdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGluZGV4OiBudW1iZXIsIGRvU2VsZWN0aW9uOiBib29sZWFuLCBkb0ZvY3VzOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkb1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGluZGV4KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMgJiYgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGVcclxuICAgICAgICAgICAgJiYgdGhpcy5zZWxlY3RJdGVtV2hlbk5hdmlnYXRpbmdXaXRoS2V5Ym9hcmQgJiYgZG9TZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG51bGwsIHRoaXMucmVuZGVyZWRJdGVtc1tpbmRleF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRvdGFsU2Nyb2xsYWJsZVNwYWNlID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHQgLSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBjb25zdCB0b3RhbFNjcm9sbGFibGVJdGVtTGVuZ3RoID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydDtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFJlbmRlcmVkSXRlbVN0YXJ0SW5kZXggPSB0b3RhbFNjcm9sbGFibGVJdGVtTGVuZ3RoICogc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgLyB0b3RhbFNjcm9sbGFibGVTcGFjZVxyXG4gICAgICAgICAgICArIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldDtcclxuXHJcbiAgICAgICAgbGV0IG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID0gLTE7XHJcbiAgICAgICAgaWYgKGluZGV4ID49IE1hdGguZmxvb3IoY3VycmVudFJlbmRlcmVkSXRlbVN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgLSAxKSkge1xyXG4gICAgICAgICAgICBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA9IGluZGV4IC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ICsgMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8PSBjdXJyZW50UmVuZGVyZWRJdGVtU3RhcnRJbmRleCkge1xyXG4gICAgICAgICAgICBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA9IGluZGV4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPj0gMCwgaXQgbWVhbnMgd2hlbiB0aGUgcmVuZGVyZWQgaXRlbSBpcyBhY3RpdmF0ZWQsIGl0IHRyaWdnZXJzIHNjcm9sbGluZyBpbiB0aGUgbGlzdC5cclxuICAgICAgICBpZiAobmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCdzIHRoZSBuZXcgc2Nyb2xsVG9wIGJhc2VkIG9uIG5ldyByZW5kZXJlZEl0ZW1TdGFydEluZGV4LlxyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBNYXRoLmZsb29yKHRvdGFsU2Nyb2xsYWJsZVNwYWNlICogKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4IC8gdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzTG9uZ0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSBsb25nIGxpc3QsIHdoaWNoIG1lYW5zIG9uZSBwaXhlbCBvZiBzY3JvbGxiYXIgbW92ZW1lbnQgY2F1c2VzIG1vcmUgdGhhbiBvbmUgc2NyZWVuIG9mIHRoZSBsaXN0IHNjcm9sbGluZyxcclxuICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHRydW5jYXRlZCByZW5kZXJlZCBpdGVtIHN0YXJ0IGluZGV4LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkU3RhcnRJbmRleCA9IE1hdGguZmxvb3Ioc2Nyb2xsVG9wIC8gdG90YWxTY3JvbGxhYmxlU3BhY2UgKiB0b3RhbFNjcm9sbGFibGVJdGVtTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgYWN0dWFsIHBvc2l0aW9uIG9mIHRoZSBhY3RpdmF0ZWQgcmVuZGVyZWQgaXRlbSBsaXN0IGNhbiBiZSBtb3JlIHRoYW4gb25lIHNjcmVlbiBiZWxvdyxcclxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4IGFuZCB0cnVuY2F0ZWRTdGFydEluZGV4LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBsYXRlciB3aGVuIHdlIHJlbmRlciB0aGUgZGF0YSB0YWJsZSBpdGVtcyBpbiB0aGUgdmlldyBwb3J0LCB3ZSB3aWxsIHVzZSB0aGUgb2Zmc2V0IHRvIGFkanVzdFxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGl0ZW0gbGlzdCB0byBtYWtlIHN1cmUgdGhlIGFjdHVhbCBhY3RpdmF0ZWQgcmVuZGVyZWQgaXRlbSBjYW4gc2hvdyB1cCBpbiB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggLSB0cnVuY2F0ZWRTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgPiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNjcm9sbFRvcCBhbmQgcmUtY2FsY3VsYXRlIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtSW5WaWV3UG9ydChmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb0ZvY3VzKSB7XHJcbiAgICAgICAgICAgIGlmIChkb1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1Jvd0J5SW5kZXgoaW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdHJ5VG9Gb2N1c1Jvd0J5SW5kZXgoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXJpYUV4cGFuZGVkQXR0cmlidXRlVmFsdWUocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuXHJcbiAgICAgICAgaWYgKHJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzR3JvdXBFeHBhbmRlZCA9IHRoaXMuaXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKTtcclxuICAgICAgICAgICAgaWYgKGlzR3JvdXBFeHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0dyb3VwRXhwYW5kZWQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAocmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUgJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzTGVhZikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAoISEocmVuZGVyZWRJdGVtLm5vZGUgJiYgcmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQpKS50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWRkaXRpb25hbFNjcmVlblJlY29yZGVyQ29udGVudChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgICAgIHN3aXRjaCAocmVuZGVyZWRJdGVtLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlOlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTm9kZUNvdW50ID0gcmVuZGVyZWRJdGVtLm5vZGUuY2hpbGRyZW4gPyByZW5kZXJlZEl0ZW0ubm9kZS5jaGlsZHJlbi5sZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc3ViTm9kZUNvdW50ID09PSAxID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLm9uZVN1Yk5vZGVJblRyZWVOb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwublN1Yk5vZGVzSW5UcmVlTm9kZS5mb3JtYXQoc3ViTm9kZUNvdW50KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXI6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1Db3VudCA9IHRoaXMuZ3JvdXBLZXlzW3JlbmRlcmVkSXRlbS5kYXRhXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBncm91cEl0ZW1Db3VudCA9PT0gMSA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5vbmVJdGVtSW5Hcm91cFxyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLm5JdGVtc0luR3JvdXAuZm9ybWF0KGdyb3VwSXRlbUNvdW50KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25FZGl0YWJsZURhdGFDaGFuZ2VkKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBmaWVsZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZWRpdGFibGVEYXRhSXRlbS5pc05ld1JvdyAmJiB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC5hZGRlZEl0ZW1zLmluZGV4T2YoZWRpdGFibGVEYXRhSXRlbS5jb250ZW50KSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtSW5kZXggPSB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC51cGRhdGVkSXRlbXMuaW5kZXhPZihlZGl0YWJsZURhdGFJdGVtLmNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRJdGVtSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLnNwbGljZSh1cGRhdGVkSXRlbUluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCB2YWxpZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbcHJvcGVydHldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0c1twcm9wZXJ0eV0udmFsaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5wdXNoKGVkaXRhYmxlRGF0YUl0ZW0uY29udGVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXNldFVwZGF0ZWQuZW1pdCh0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXRFZGl0YWJsZURhdGFDaGFuZ2VzZXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQgPSB7XHJcbiAgICAgICAgICAgIGFkZGVkSXRlbXM6IFtdLFxyXG4gICAgICAgICAgICB1cGRhdGVkSXRlbXM6IFtdLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXM6IFtdXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmNoYW5nZXNldFVwZGF0ZWQuZW1pdCh0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVmFsaWRhdGlvbkFsZXJ0SGFuZGxlcihyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgZmllbGQ6IHN0cmluZywgYWxlcnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbZmllbGRdID0gYWxlcnQ7XHJcblxyXG4gICAgICAgIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0Lmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbi5maWVsZCAmJiBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbY29sdW1uLmZpZWxkXSAmJiAhY29sdW1uLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgcmVuZGVyZWRJdGVtLnZhbGlkYXRpb25SZXN1bHQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbHVtbi5oZWFkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQ6IGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0c1tjb2x1bW4uZmllbGRdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGhhcyB2YWxpZGF0aW9uIGVycm9yIGlmIHRoZXJlIGFyZSBhbnkgdmFsaWRhdGlvbiBhbGVydHNcclxuICAgIHB1YmxpYyBoYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gcmVuZGVyZWRJdGVtLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVuZGVyZWRJdGVtLnZhbGlkYXRpb25SZXN1bHQubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Um9sZUF0dHJpYnV0ZUZvclRyZWVUYWJsZVJvdyhyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0Um9sZUF0dHJpYnV0ZUZvclRyZWVUYWJsZVJvdyhyZW5kZXJlZEl0ZW0sIHRoaXMuc2hvd0hlYWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyaWFTb3J0QXR0cmlidXRlVmFsdWUoY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEFyaWFTb3J0QXR0cmlidXRlVmFsdWUoY29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oa2VlcEhpZ2hsaWdodEZyb21Sb3c/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFrZWVwSGlnaGxpZ2h0RnJvbVJvdykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodEZyb21Sb3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyBjaGVja0lzVGFibGVSZW5kZXJlZE9uUGhvbmVEb3duV2l0aE1pbkhlaWdodChzaG91bGRFbWl0PzogYm9vbGVhbiwgZm9yY2VMYXlvdXQ/OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXJcclxuICAgICAgICAgICAgLmNoZWNrSXNUYWJsZVJlbmRlcmVkT25QaG9uZURvd25XaXRoTWluSGVpZ2h0KHRoaXMuaGVhZGVyVGFibGVFbGVtZW50LCB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQpKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvdWxkRW1pdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RhYmxlUmVuZGVyZWRXaXRoTWluSGVpZ2h0UGhvbmVEb3duLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmb3JjZUxheW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkRW1pdCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVGFibGVSZW5kZXJlZFdpdGhNaW5IZWlnaHRQaG9uZURvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZm9yY2VMYXlvdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlSGlnaGxpZ2h0RnJvbVJvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmF2aWdhdGVCeVBhdGgocGF0aFNlY3Rpb25zOiBzdHJpbmdbXSxcclxuICAgICAgICBnZXROb2RlTGFiZWxIYW5kbGVyOiAobm9kZTogVHJlZU5vZGVEYXRhSXRlbSkgPT4gc3RyaW5nLFxyXG4gICAgICAgIG9uVGFza0ZpbmlzaGVkSGFuZGxlcj86IChmb3VuZDogYm9vbGVhbikgPT4gdm9pZCxcclxuICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcj86IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBib29sZWFuLFxyXG4gICAgICAgIHRpbWVvdXQgPSA1MDAwLFxyXG4gICAgICAgIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGU/OiBib29sZWFuLCBtYXRjaEZpcnN0QUZldz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9kZSBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgPSB7XHJcbiAgICAgICAgICAgIHBhdGhTZWN0aW9uczogcGF0aFNlY3Rpb25zLFxyXG4gICAgICAgICAgICBpc1J1bm5pbmc6IHRydWUsXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoU2VjdGlvbkluZGV4OiAwLFxyXG4gICAgICAgICAgICBjdXJyZW50UmVuZGVyZWRJdGVtSW5kZXg6IDAsXHJcbiAgICAgICAgICAgIG9uVGFza0ZpbmlzaGVkOiBvblRhc2tGaW5pc2hlZEhhbmRsZXIsXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoU2VjdGlvblN0YXJ0VGltZTogbmV3IERhdGUoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlUGF0aE5hdmlnYXRpb24oXHJcbiAgICAgICAgICAgIGdldE5vZGVMYWJlbEhhbmRsZXIsXHJcbiAgICAgICAgICAgIGlzTm9kZUxvYWRpbmdIYW5kbGVyLFxyXG4gICAgICAgICAgICB0aW1lb3V0LFxyXG4gICAgICAgICAgICBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBtYXRjaEZpcnN0QUZldyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFsbEl0ZW1DaGVja0JveEFyaWFMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKSA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC51bnNlbGVjdEFsbEl0ZW1zXHJcbiAgICAgICAgICAgIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLnNlbGVjdEFsbEl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtZGF0YS10YWJsZSdcclxuICAgICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVBhdGhOYXZpZ2F0aW9uKGdldE5vZGVMYWJlbEhhbmRsZXI6IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBzdHJpbmcsXHJcbiAgICAgICAgaXNOb2RlTG9hZGluZ0hhbmRsZXI/OiAobm9kZTogVHJlZU5vZGVEYXRhSXRlbSkgPT4gYm9vbGVhbixcclxuICAgICAgICB0aW1lb3V0PzogbnVtYmVyLCBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlPzogYm9vbGVhbixcclxuICAgICAgICBsYXN0Rm91bmROb2RlPzogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBtYXRjaEZpcnN0QUZldz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2hvdWxkQ29udGludWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZE5vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGxldCBuZWFyTWF0Y2hOb2RlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4IDwgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXg7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQ29udGludWUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBnZXROb2RlTGFiZWxIYW5kbGVyKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnNbdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXhdLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUuZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleCA8IHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUoZXZlbnQsIHRoaXMucmVuZGVyZWRJdGVtc1tpXSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE5vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb25seVRyaWdnZXJTZWxlY3Rpb25Gb3JMYXN0Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RGb3VuZE5vZGUgPSB0aGlzLnJlbmRlcmVkSXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4ID09PSB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiAhPT0gdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG51bGwsIHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDb250aW51ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOb2RlTG9hZGluZ0hhbmRsZXIgfHwgIWlzTm9kZUxvYWRpbmdIYW5kbGVyKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFJlbmRlcmVkSXRlbUluZGV4ID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uU3RhcnRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmVhck1hdGNoTm9kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9uc1t0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYWJlbC5pbmRleE9mKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9uc1tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXhdLnRvTG9jYWxlTG93ZXJDYXNlKCkpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVhck1hdGNoTm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMucmVuZGVyZWRJdGVtc1tpXS5kZXB0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXggLSAxXS5kZXB0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvbnRpbnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kTm9kZSAmJiBub3cuZ2V0VGltZSgpIC0gdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uU3RhcnRUaW1lLmdldFRpbWUoKSA+IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5vblRhc2tGaW5pc2hlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sub25UYXNrRmluaXNoZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lYXJNYXRjaE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0obnVsbCwgbmVhck1hdGNoTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTZWxlY3RlZEl0ZW1JbnRvVmlldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdEZvdW5kTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCBsYXN0Rm91bmROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQYXRoTmF2aWdhdGlvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vZGVMYWJlbEhhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvdW5kTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRmlyc3RBRmV3KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIDIwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplVUkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wUm93RWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzb3J0SXRlbXMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcyAmJiB0aGlzLnNvcnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5zb3J0Q29sdW1uLnNvcnRhYmxlID09PSAnY3VzdG9tJyA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvcnRDb2x1bW4uY29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcykgOiB0aGlzLmRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnRDb2x1bW4uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZCA/IDEgOiAtMTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ncm91cENvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlICYmIHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXMubGFzdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlZEl0ZW0uZGF0YS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZU5ld1Jvd1JlbmRlcmVkSXRlbSA9IHJlbmRlcmVkSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnNwbGljZSh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBzaG91bGRGYWxsQmFja1RvRGVmYXVsdFNvcnQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHJlYWR5TG9hZGVkQWxsRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtc1tpXSB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5TG9hZGVkQWxsRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRDb2x1bW4gPT09IHRoaXMucHJldmlvdXNTb3J0Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSB0aGlzLnJlbmRlcmVkSXRlbXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5TG9hZGVkQWxsRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc1tpXSA9IHsgaW5kZXg6IGksIGRhdGE6IHVuZGVmaW5lZCwgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWwgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEZhbGxCYWNrVG9EZWZhdWx0U29ydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5kb0N1c3RvbVNvcnQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uLCBmaWVsZDogdGhpcy5zb3J0Q29sdW1uLmZpZWxkLCBmYWxsQmFja1RvRGVmYXVsdFNvcnQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0IHx8IHRoaXMuZG9DdXN0b21Tb3J0Lm9ic2VydmVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLCBiLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLmNvbnRlbnQsIGIuZGF0YS5jb250ZW50LCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaW4gXCJlbHNlXCIgYmxvY2sgaGFuZGxlcyB0aGUgc29ydCBpbiB0aGUgdHJlZSBub2Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgc29ydHMgdGhlIHRyZWUgbm9kZXMgb25seSBpbiBpdHMgb3duIHRyZWUgbGV2ZWwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgbm9kZXMgaGF2ZSBzdWIgbm9kZXMgYW5kIG90aGVyIG5vZGVzIGRvbid0IGhhdmUgc3ViIG5vZGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgcHV0IHRoZSBub2RlcyB3aXRoIHN1YiBub2RlcyBpbiBmcm9udCBvZiB0aGUgbm9kZXMgd2l0aG91dCBzdWIgbm9kZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gW3RoaXMuc2hhZG93VHJlZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goY3VycmVudE5vZGUuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5zcGxpY2Uoc3RhY2subGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBjdXJyZW50Tm9kZS5jaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY29tcGFyZSByZXN1bHQgYWJvdXQgMSBvciAtMSBpcyByZXZlcnNlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBpZiBhIGlzIGdyZWF0ZXIgdGhhbiBiLCAxIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiAtMS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGJlY2F1c2UgdGhvc2Ugbm9kZXMgYXJlIHdlbnQgdGhvdWdoIGluIHRoZSBzdGFjayB3aXRoIGlzIEZJRk8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIG9yZGVyIGlzIHJldmVyc2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRDb2x1bW4gPT09IHRoaXMuYWN0dWFsQ29sdW1uc1swXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5kYXRhLmhhc0NoaWxkcmVuICYmICFiLmRhdGEuaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhLmRhdGEuaGFzQ2hpbGRyZW4gJiYgYi5kYXRhLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGEuZGF0YS5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGIuZGF0YS5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGJWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBiVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEuZGF0YSwgYi5kYXRhLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZU5ld1Jvd1JlbmRlcmVkSXRlbSAmJiB0aGlzLmVkaXRhYmxlQXV0b05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIHRoZSBzb3J0aW5nIHdoZW4gZ3JvdXBpbmcgaXMgZW5hYmxlZC5cclxuICAgICAgICAgICAgICAgIC8vIEl0IHNvcnRzIHRoZSBncm91cCBpdGVtcyBpbiBlYWNoIG9mIHRoZSBncm91cC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdID0gW107XHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBlZFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRSZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcyA9IGdyb3VwZWRSZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEsIGIuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRSZW5kZXJlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRSZW5kZXJlZEl0ZW1zLnB1c2godGhpcy5yZW5kZXJlZEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcy5wdXNoKHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRSZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMgPSBncm91cGVkUmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YSwgYi5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFJlbmRlcmVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHNvcnRlZFJlbmRlcmVkSXRlbXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleEJ5U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRDb21wYXJlRnVuY3Rpb24oYTogRGF0YVRhYmxlRGF0YUl0ZW0sIGI6IERhdGFUYWJsZURhdGFJdGVtLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKCFhICYmICFiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmICghYSAmJiBiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhICYmICFiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBhVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGEsIGZpZWxkKTtcclxuICAgICAgICAgICAgbGV0IGJWYWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoYiwgZmllbGQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlb2YgYVZhbHVlO1xyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICBhVmFsdWUgPSBhVmFsdWUgPT09IDAgPyBhVmFsdWUgOiAoYVZhbHVlIHx8IE51bWJlci5NSU5fVkFMVUUpO1xyXG4gICAgICAgICAgICAgICAgYlZhbHVlID0gYlZhbHVlID09PSAwID8gYlZhbHVlIDogKGJWYWx1ZSB8fCBOdW1iZXIuTUlOX1ZBTFVFKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYVZhbHVlID4gYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhVmFsdWUgPSBhVmFsdWUgJiYgYVZhbHVlLnRvU3RyaW5nICYmIGFWYWx1ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICBiVmFsdWUgPSBiVmFsdWUgJiYgYVZhbHVlLnRvU3RyaW5nICYmIGJWYWx1ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgd2UgZG8gbmF0dXJhbCBzb3J0IGhlcmUuXHJcbiAgICAgICAgICAgICAgICAvLyBCYXNlZCBvbiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24sIFwiYTEwMFwiLFwiYTIwXCIsXCJhM1wiIHdpbGwgYmUgc29ydGVkIGFzIFwiYTEwMFwiLFwiYTIwXCIsXCJhM1wiLlxyXG4gICAgICAgICAgICAgICAgLy8gQnV0IGJhc2VkIG9uIG5hdHVyYWwgc29ydCwgdGhleSB3aWxsIGJlIHNvcnRlZCBhcyBcImEzXCIsXCJhMjBcIixcImExMDBcIi5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlTmF0dXJhbFNvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc051bWJlciA9ICh0ZXh0OiBzdHJpbmcpID0+IHRleHQgPj0gJzAnICYmIHRleHQgPD0gJzknO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIDEsIGZpZ3VyZSBvdXQgdGhlIGNvbW1vbiBwYXJ0IG9mIDIgc3RyaW5ncy5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGFWYWx1ZS5sZW5ndGggJiYgaW5kZXggPCBiVmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWVbaW5kZXhdICE9PSBiVmFsdWVbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCAyLCBpZiB0aGUgcmVzdCBwYXJ0IG9mIGVhY2ggc3RyaW5nIHN0YXJ0cyB3aXRoIGEgbnVtYmVyLCBwYXJzZSB0aGUgcmVzdCBwYXJ0IGludG8gZmxvYXQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2VGbG9hdCBmdW5jdGlvbiBpcyB2ZXJ5IGR1cmFibGUsIGl0IGNhbiBwYXJzZSBcIjEuNWFiY1wiIGFzIFwiMS41XCIgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSB0aGF0IHRoZSByZXN0IHBhcnRcclxuICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgc3RyaW5nIGlzIG1peGVkIHdpdGggbnVtYmVycyBhbmQgbGV0dGVycy5cclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzdCBwYXJ0IG9mIGVhY2ggc3RyaW5nIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlbiBkb24ndCBkbyBuYXR1cmFsIHNvcnQsIGp1c3QgZG8gbm9ybWFsIHN0cmluZyBzb3J0LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bWJlcihhVmFsdWVbaW5kZXhdKSAmJiBpc051bWJlcihiVmFsdWVbaW5kZXhdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhTnVtYmVyID0gcGFyc2VGbG9hdChhVmFsdWUuc3Vic3RyaW5nKGluZGV4LCBhVmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJOdW1iZXIgPSBwYXJzZUZsb2F0KGJWYWx1ZS5zdWJzdHJpbmcoaW5kZXgsIGJWYWx1ZS5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFOdW1iZXIgPiBiTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFOdW1iZXIgPCBiTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWUgPiBiVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA+IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzVmVydGljYWxPdmVyZmxvdygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFsaWduU2Nyb2xsQmFyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhhc1ZlcnRpY2FsT3ZlcmZsb3cgPSB0aGlzLmhhc1ZlcnRpY2FsT3ZlcmZsb3coKTtcclxuICAgICAgICBpZiAoIXRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlU2Nyb2xsYmFyV2lkdGgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhhc1ZlcnRpY2FsT3ZlcmZsb3cgIT09IHRoaXMuY3VycmVudEhhc1ZlcnRpY2FsT3ZlcmZsb3cgJiYgdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGhhc1ZlcnRpY2FsT3ZlcmZsb3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSAnY2FsYygxMDAlIC0gJyArIHRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoICsgJ3B4KSc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCArICdweCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzBweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SGFzVmVydGljYWxPdmVyZmxvdyA9IGhhc1ZlcnRpY2FsT3ZlcmZsb3c7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVTY3JvbGxiYXJXaWR0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxEaXYpO1xyXG4gICAgICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSAnc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24tc3RyZXRjaCBzbWUtYXJyYW5nZS1vdmVyZmxvdy1zY3JvbGwnO1xyXG4gICAgICAgIHNjcm9sbERpdi5zdHlsZS50b3AgPSAnLTk5OTlweCc7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYub2Zmc2V0V2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCA9IHNjcm9sbGJhcldpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlSXRlbUluVmlld1BvcnQocHJldmVudFNjcm9sbGluZz86IGJvb2xlYW4sIGZvcmNlVXBkYXRlPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIC8vIFNjcm9sbCBjb250YWluZXIgaXMgdGhlIGRpdiB0byByZW5kZXIgdGhlIHZpZXcgcG9ydCBvZiB0aGUgZGF0YSB0YWJsZSBhbmQgdG8gcHJvdmlkZSB0aGUgc2Nyb2xsIGJhci5cclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlcyBob3cgbWFueSBpdGVtcyBjYW4gYmUgcmVuZGVyZWQgaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ID0gdGhpcy5zY3JvbGxhYmxlXHJcbiAgICAgICAgICAgICAgICA/IE1hdGgubWluKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gdGhpcy5yb3dIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTY3JvbGxQaXhlbHMgPSB0aGlzLmRlZmF1bHRTY3JvbGxQZXJjZW50YWdlICogc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTY3JvbGxQaXhlbHMgPSBNYXRoLmZsb29yKGRlZmF1bHRTY3JvbGxQaXhlbHMgLyB0aGlzLnJvd0hlaWdodCkgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgICBsZXQgaXNBdExhc3RTY3JlZW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZW5kZXJlZEl0ZW1TdGFydCA9IDA7XHJcbiAgICAgICAgICAgIGxldCByZW5kZXJlZEl0ZW1FbmQgPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNMb25nTGlzdCAmJiBwcmV2ZW50U2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhU2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICogdGhpcy5jdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQgLyAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLmRhdGFTY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIHdoaWNoIGl0ZW0gaXMgdGhlIHN0YXJ0aW5nIGl0ZW0gaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaWRlYSBoZXJlIGlzIHRvIGNhbGN1bGF0ZSB0aGUgcGVyY2VudGFnZSBvZiBob3cgZmFyIHRoZSBzY3JvbGxiYXIgbW92ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRpc3RhbmNlIHRoZSBzY3JvbGxiYXIgY2FuIG1vdmUgaXMgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgc2Nyb2xsYmFyIG1pbnVzIHRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHRoaXMuZGF0YVNjcm9sbFRvcCkgIT09IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNjcm9sbFRvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjdXJhdGVTdGFydEluZGV4ID0gKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpICogdGhpcy5kYXRhU2Nyb2xsVG9wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLmZsb29yKGFjY3VyYXRlU3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgPiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0F0TGFzdFNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0ID0gc3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBzaG9ydCBhbmQgbm8gbmVlZCB0byBoYXZlIHNjcm9sbCBiYXIsIGp1c3Qgc2ltcGx5IHNldCB0aGUgc3RhcnQgaW5kZXggdG8gMC5cclxuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCA8PSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbVN0YXJ0ID0gc3RhcnRJbmRleCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAqIHRoaXMuYnVmZmVyUm93UmF0ZTtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaXN0IGlmIHNob3J0LCByZW5kZXJlZEl0ZW1FbmQgc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSB0aGUgc3RhcnQgaW5kZXggcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGluIHRoZSB2aWV3IHBvcnQgcGx1cyB0aGUgbGVuZ3RoICogYnVmZmVyIHJhdGUuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW1FbmQgPSBNYXRoLm1pbih0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLCBNYXRoLmNlaWwoc3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ICogdGhpcy5idWZmZXJSb3dSYXRlKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzaG91bGRMYXp5TG9hZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbG9naWMgY2FsY3VsYXRlcyB3aGljaCBwYXJ0IG9mIGRhdGEgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIHRoZSBsYXp5IGxvYWRpbmcgZXZlbnQuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXp5TG9hZFN0YXJ0ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZW5kZXJlZEl0ZW1TdGFydCkpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGFjdHVhbExhenlMb2FkU3RhcnQgPSBsYXp5TG9hZFN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF6eUxvYWRMZW5ndGggPSBNYXRoLm1pbih0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLCByZW5kZXJlZEl0ZW1FbmQpIC0gbGF6eUxvYWRTdGFydDtcclxuICAgICAgICAgICAgICAgIGxldCBhY3R1YWxMYXp5TG9hZExlbmd0aCA9IGxhenlMb2FkTGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBsYXp5TG9hZFN0YXJ0OyBpIDwgbGF6eUxvYWRTdGFydCArIGxhenlMb2FkTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJJdGVtRmxhZyA9ICghdGhpcy5yZW5kZXJlZEl0ZW1zW2ldIHx8ICF0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRMYXp5TG9hZCAmJiByZW5kZXJJdGVtRmxhZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRMYXp5TG9hZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbExhenlMb2FkU3RhcnQgPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTGF6eUxvYWQgJiYgIXJlbmRlckl0ZW1GbGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxMYXp5TG9hZExlbmd0aCA9IGkgKyAxIC0gYWN0dWFsTGF6eUxvYWRTdGFydDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsTGF6eUxvYWRMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRMYXp5TG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRMYXp5TG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3J0T3JkZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNvcnRDb2x1bW4uc29ydE1vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlU29ydE1vZGUuQXNjZW5kOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLkRlc2NlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhenlMb2FkRXZlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBhY3R1YWxMYXp5TG9hZFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGFjdHVhbExhenlMb2FkTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hMb2FkaW5nRGF0YTogKGl0ZW1zLCBhbGxJdGVtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zW2FjdHVhbExhenlMb2FkU3RhcnQgKyBpXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBhY3R1YWxMYXp5TG9hZFN0YXJ0ICsgaSwgZGF0YTogaXRlbXNbaV0sIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuTm9ybWFsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2V0IGludGVybmFsIGl0ZW1zIHNvIHRoYXQgd2UgY2FuIHNlbGVjdCBhbGwsIGFuZCBzbyB3ZSBjYW4gZG8gZmlsdGVyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zID0gYWxsSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSByZWZyZXNoIHRvIG1ha2UgdGhlIGNoYW5nZXMgcmVmbGVjdCBvbiBVSSwgd2lsbCBub3QgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIGFmdGVyIGZpcnN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCwgdGhlIHNob3VsZExhenlMb2FkIHdpbGwgYmUgc2V0IHRvIGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXI6IHNvcnRPcmRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydEZpZWxkOiB0aGlzLnNvcnRDb2x1bW4gPyB0aGlzLnNvcnRDb2x1bW4uZmllbGQgOiB0aGlzLmFjdHVhbENvbHVtbnMgPyB0aGlzLmFjdHVhbENvbHVtbnNbMF0uZmllbGQgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nRGF0YS5lbWl0KGxhenlMb2FkRXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsTGF6eUxvYWRMZW5ndGggPj0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ICogdGhpcy5idWZmZXJSb3dSYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCdXN5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkTGF6eUxvYWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGRpc3BsYXlpbmcgbGlzdCBpdGVtIGluIHRoZSB2aWV3IHBvcnQgaXMgbW92aW5nIGR1ZSB0byBzY3JvbGwgYmFyIGlzIG1vdmluZyxcclxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSB0b3Agb2YgdGhlIHNjcm9sbCBkYXRhIGVsZW1lbnQuXHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgaXRlbSBvZiB0aGUgc2Nyb2xsIGRhdGEgZWxlbWVudCB3b24ndCBhbHdheXMgYWxpZ2ggdG8gdGhlIHRvcCBvZiB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICAgICAgLy8gU28gaGVyZSB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgaXRlbS5cclxuICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCAlIHRoaXMucm93SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IHdoZW4gdGhlIGRpc3BsYXkgaXRlbSBsaXN0IGlzIGV2ZW4gbG9uZ2VyIHRoYW4gdGhlIHNjcm9sbCBjb250YWluZXIgaGVpZ2h0ICogcm93IGhlaWdodCxcclxuICAgICAgICAgICAgICAgIC8vIGl0IG1lYW5zIHdoZW4gd2UgbW92ZSAxIHBpeGVsIG9mIHRoZSBzY3JvbGwgYmFyLCB0aGUgZGF0YSB0YWJsZSB3aWxsIG1vdmUgYnkgYXQgbGVhc3Qgb25lIGl0ZW0uXHJcbiAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdvbid0IG5lZWQgdG8gaGFuZGxlIG9mZnNldCBzaW5jZSB3ZSBkb24ndCBoYXZlIGEgY2hhbmNlIHRvIHNob3cgXCJoYWxmIGRhdGEgdGFibGUgaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAvLyBhdCB0aGUgdG9wIGJvcmRlciBvZiB0aGUgc2Nyb2xsIGNvbnRhaW5lciBieSBtb3ZpbmcgdGhlIHNjcm9sbCBiYXIgdmVyeSBsaXR0bGUuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA+IHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0ICogdGhpcy5yb3dIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlVUlWaXJ0dWFsaXphdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUl0ZW1zVG9wID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgLSBvZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbUluZGV4ID0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JbmRleCA+IHN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgLSAxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlbGVjdGVkSXRlbUluZGV4IDwgc3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlJdGVtc1RvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChzZWxlY3RlZEl0ZW1JbmRleCAtIHN0YXJ0SW5kZXggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKyAxKSAqIHRoaXMucm93SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2Nyb2xsIGJhciBpcyBtb3ZlZCB0byB2ZXJ5IGJvdHRvbSwgd2UganVzdCBzaW1wbHkgYWxpZ24gdGhlIGRpc3BsYXllZCBkYXRhIHRhYmxlIGl0ZW1zJ3MgYm90dG9tXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGJvdHRvbSBvZiB0aGUgY29udGFpbmVyIHRvIG1ha2Ugc3VyZSB0aGUgbGFzdCBkYXRhIHRhYmxlIGl0ZW0gY2FuIGJlIGRpc3BsYXllZCBjb21wbGV0ZWx5LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2hlbiB0aGUgbGlzdCBpcyBzdXBlciBsb25nIChyZWZlciB0byBob3cgd2UgY2FsY3VsYXRlIHRoZSB0b3Agb2Zmc2V0IG9mIHRoZSBzdXBlciBsb25nIGxpc3QpLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZW0gbWF5IG5vdCBiZSByZW5kZXJlZCBjb21wbGV0ZWx5LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoID4gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgKiB0aGlzLnJvd0hlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCA+PVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gdGhpcy5yb3dIZWlnaHQgLyAyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzQXRMYXN0U2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUl0ZW1zVG9wID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTWF0aC5jZWlsKHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCkgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGF0YVN0eWxlVG9wID0gdGhpcy5kaXNwbGF5SXRlbXNUb3AgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVVwZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbEFib3ZlRGF0YUVsZW1lbnQoTWF0aC5yb3VuZChzdGFydEluZGV4IC0gcmVuZGVyZWRJdGVtU3RhcnQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKCF0aGlzLmN1cnJlbnRSZW5kZXJlZEl0ZW1JblZpZXdQb3J0IHx8ICF0aGlzLnJlbmRlcmVkSXRlbXNbc3RhcnRJbmRleF1cclxuICAgICAgICAgICAgICAgICAgICB8fCAodGhpcy5yZW5kZXJlZEl0ZW1zW3N0YXJ0SW5kZXhdLmRhdGEgIT09IHRoaXMuY3VycmVudFJlbmRlcmVkSXRlbUluVmlld1BvcnQuZGF0YSkpXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgZm9yY2VVcGRhdGUgfHwgdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgZGlzcGxheSBkYXRhIGFib3ZlIHRoZSB2aWV3IHBvcnQgYW5kIGRpc3BsYXkgZGF0YSBpbiBhbmQgYmVsb3cgdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB3aGVuIHdlIHB1c2ggbmV3IGl0ZW0gaW50byB0aGUgYXJyYXlzLCB3ZSBjcmVhdGUgYSBuZXcgb2JqZWN0IHRvIHdyYXAgdGhlIGRpc3BsYXkgaXRlbS5cclxuICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHdlIHdhbnQgdG8gZm9yY2UgdGhlIG5nRm9yIHRvIHJlLXJlbmRlciBhbGwgdGhlIGl0ZW1zIGluc3RlYWQgb2Ygb25seSByZS1yZW5kZXIgdGhlIHVwZGF0ZWQgb25lcy5cclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIG5nRm9yIHdpbGwgdHJ5IHRvIGFkanVzdCBET00gb3JkZXIgb2YgdGhvc2UgaXRlbXMgd2hpY2ggbWVzc2VzIHVwIHRoZSBzY3JvbGwgYmFyIHBvc2l0aW9uLlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNJbkFuZEJlbG93Vmlld1BvcnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3VsZFNjcm9sbCA9IHRoaXMuc2Nyb2xsYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHQgPiBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGhpcy5lZGl0YWJsZSB8fCB0aGlzLmF1dG9Sb3dIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZFNjcm9sbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcmVuZGVyZWRJdGVtU3RhcnQ7IGkgPCBzdGFydEluZGV4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IHN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnNob3dBc1RyZWUgPyBjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUuZGF0YSA6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiBjdXJyZW50UmVuZGVyZWRJdGVtLmRlcHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW46IGN1cnJlbnRSZW5kZXJlZEl0ZW0uaGFzQ2hpbGRyZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBjdXJyZW50UmVuZGVyZWRJdGVtLnBvc2l0aW9uSW5TZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplOiBjdXJyZW50UmVuZGVyZWRJdGVtLnNldFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0OiBjdXJyZW50UmVuZGVyZWRJdGVtLnZhbGlkYXRpb25SZXN1bHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydC5wdXNoKHsgZGF0YTogeyBwbGFjZWhvbGRlcjogdHJ1ZSB9LCB0eXBlOiBudWxsLCBpbmRleDogbnVsbCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCByZW5kZXJlZEl0ZW1FbmQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNJbkFuZEJlbG93Vmlld1BvcnQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY3VycmVudFJlbmRlcmVkSXRlbS50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc2hvd0FzVHJlZSA/IGN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZS5kYXRhIDogY3VycmVudFJlbmRlcmVkSXRlbS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiBjdXJyZW50UmVuZGVyZWRJdGVtLmRlcHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuOiBjdXJyZW50UmVuZGVyZWRJdGVtLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogY3VycmVudFJlbmRlcmVkSXRlbS5wb3NpdGlvbkluU2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uc2V0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0OiBjdXJyZW50UmVuZGVyZWRJdGVtLnZhbGlkYXRpb25SZXN1bHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Nyb2xsYWJsZSAmJiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoID4gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNJbkFuZEJlbG93Vmlld1BvcnQucHVzaCh7IGRhdGE6IHsgcGxhY2Vob2xkZXI6IHRydWUgfSwgdHlwZTogbnVsbCwgaW5kZXg6IG51bGwgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSZW5kZXJlZEl0ZW1JblZpZXdQb3J0ID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3N0YXJ0SW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0J1c3kgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNbaV0uaW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNTbWVGb3JtRmllbGQoPEhUTUxFbGVtZW50PmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGp1bXAgZnJvbSBlZGl0YWJsZSBmb3JtIGZpZWxkcyB0b3dhcmRzIHRoZSByb3cgd2hlbiByZS1jYWxjdWxhdGluZyBpdGVtc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCByZXNldCB2YWxpZGF0aW9uIGVycm9ycyBvbiB3aW5kb3cgcmVzaXppbmdcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCAhPT0gdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3codGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NGaWx0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0ID0gdGhpcy5pbnRlcm5hbFF1ZXJ5RWRpdG9yO1xyXG4gICAgICAgIGNvbnN0IGhhc1ZhbGlkUXVlcnlFZGl0b3IgPSAodmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0ICYmIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cyAmJlxyXG4gICAgICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMubGVuZ3RoKTtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVyIGluc3RhbmNlb2YgU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VhcmNoRm9ybUZpZWxkID0gPFNlYXJjaEZvcm1GaWVsZENvbXBvbmVudD50aGlzLmdsb2JhbEZpbHRlcjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcktleXdvcmQgPSBzZWFyY2hGb3JtRmllbGQudmFsdWUgJiYgc2VhcmNoRm9ybUZpZWxkLnZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcktleXdvcmQgPSB0aGlzLmdsb2JhbEZpbHRlclsndmFsdWUnXSA/IHRoaXMuZ2xvYmFsRmlsdGVyWyd2YWx1ZSddLnRvTG9jYWxlTG93ZXJDYXNlKCkudHJpbSgpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5maWx0ZXJLZXl3b3JkICYmICFoYXNWYWxpZFF1ZXJ5RWRpdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLmludGVybmFsSXRlbXMubWFwKGl0ZW0gPT4gaXRlbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnRlcm5hbEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGaXJzdCBmaWx0ZXIgYnkgdGhlIG1hc3RlciB2aWV3IGZpbHRlcnMgaWYgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBmaWx0ZXIgYnkgdGhlIGNvbHVtbiBmaWx0ZXJzXHJcbiAgICAgICAgICAgICAgICAvLyBOb3RlIGZpbHRlciBpbnNpZGUgdGhlIGNvbHVtbiBmaWx0ZXJzIGFyZSBpbnRlcnNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgICAvLyBDb2x1bW4gZmlsdGVycyBtdWx0aXBsZSBjb21ib2JveCB3aWxsIGJlIHVuaW9uXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnRlcm5hbEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaW50ZXJuYWxJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyB0aGUgZGF0YXRhYmxlIG9yaWdpbmFsIGZpbHRlcnMgb25seSBpZiB1c2VkIGluIG1hc3RlciB2aWV3LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFuZCBoYXMgdmFsaWQgZmlsdGVyS2V5d29yZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcktleXdvcmQgJiYgdGhpcy5maWx0ZXJLZXl3b3JkLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiBjb2x1bW4uc2VhcmNoYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoaXRlbSwgKHRoaXMuZWRpdGFibGUgPyAnY29udGVudC4nIDogJycpICsgY29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uZmlsdGVyT3ZlcnJpZGluZ0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24odmFsdWUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYXNlU2Vuc2l0aXZlRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5pbmRleE9mKHRoaXMuZmlsdGVyS2V5d29yZCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbHRlcktleXdvcmQgaXMgZW1wdHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhpcyBkYXRhdGFibGUgaXMgbm90IHVzZWQgaW4gbWFzdGVyIHZpZXdcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBmb3VuZCBieSBkYXRhdGFibGUgb3JpZ2luYWwgZmlsdGVyKGZyb20gbWFzdGVyIHZpZXcpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgaWYgb3JpZ2luYWwgZmlsdGVyIGlzIGVtcHR5KG5vdCBpbiBtYXN0ZXIgdmlldylcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1ZhbGlkUXVlcnlFZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbHRlciBieSBxdWVyeSBlZGl0b3IgaWYgYXBwbGllZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnF1ZXJ5RWRpdG9yRmlsdGVyTWFpbih2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHNhdGlzZnkgYm90aCBvcmlnaW5hbCBmaWx0ZXJzIGFuZCB0aGUgcXVlcnkgZWRpdG9yIGZpbHRlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQXJpYUF0dHJpYnV0ZXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50YWJsZUFyaWFMYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRoaXMudGFibGVBcmlhTGFiZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlQXJpYUxhYmVsbGVkQnkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIHRoaXMudGFibGVBcmlhTGFiZWxsZWRCeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUgfHwgdGhpcy5zZWxlY3RhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAgICAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUcmVlTm9kZShub2RlOiBUcmVlTm9kZURhdGFJdGVtLCBkZXB0aDogbnVtYmVyLCBwYXJlbnRTaGFkb3dUcmVlTm9kZTogYW55LCBwb3NpdGlvbkluU2V0OiBudW1iZXIsIHNldFNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnJlbWVtYmVyVHJlZU5vZGVUb2dnbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmdldFRyZWVOb2RlRGF0YUlkZW50aXR5KG5vZGUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50cmVlVG9nZ2xlU3RhdHVzLmhhc093blByb3BlcnR5KGlkZW50aXR5KSkge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IHRoaXMudHJlZVRvZ2dsZVN0YXR1c1tpZGVudGl0eV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gbm9kZS5jYW5FeHBhbmQgfHwgbm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgbm9kZS5pc0xlYWYgPSAhaGFzQ2hpbGRyZW47XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkSXRlbSA9IHtcclxuICAgICAgICAgICAgZGF0YTogbm9kZS5kYXRhLFxyXG4gICAgICAgICAgICB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlLFxyXG4gICAgICAgICAgICBkZXB0aDogZGVwdGgsXHJcbiAgICAgICAgICAgIGhhc0NoaWxkcmVuOiBoYXNDaGlsZHJlbixcclxuICAgICAgICAgICAgbm9kZTogbm9kZSxcclxuICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uSW5TZXQ6IHBvc2l0aW9uSW5TZXQsXHJcbiAgICAgICAgICAgIHNldFNpemU6IHNldFNpemVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKHJlbmRlcmVkSXRlbSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTaGFkb3dUcmVlTm9kZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogcmVuZGVyZWRJdGVtLFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogW11cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBXZSBuZWVkIHRvIG1haW50YWluIGEgc2hhZG93IHRyZWUgdG8gaGFuZGxlIHRoZSBcInNhbWUgbGV2ZWwgb25seVwiIHNvcnRpbmcuXHJcbiAgICAgICAgcGFyZW50U2hhZG93VHJlZU5vZGUuY2hpbGRyZW4ucHVzaChjdXJyZW50U2hhZG93VHJlZU5vZGUpO1xyXG5cclxuICAgICAgICBpZiAocmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQgJiYgbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICBsZXQgY3VycmVudFBvc2l0aW9uSW5TZXQgPSAxO1xyXG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGUoY2hpbGQsIGRlcHRoICsgMSwgY3VycmVudFNoYWRvd1RyZWVOb2RlLCBjdXJyZW50UG9zaXRpb25JblNldCwgbm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uSW5TZXQrKztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVSZW5kZXJJdGVtcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ncm91cENvbHVtbiAmJiB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBLZXlzID0ge307XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwczogeyBncm91cDogRGF0YVRhYmxlRGF0YUl0ZW0sIGl0ZW1zOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSB9W10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwU29ydE1vZGUgIT09IERhdGFUYWJsZVNvcnRNb2RlLk5vbmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVGdW5jdGlvbiA9IHRoaXMuZ3JvdXBDb2x1bW4uc29ydGFibGUgPT09ICdjdXN0b20nID9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwQ29sdW1uLmNvbXBhcmVGdW5jdGlvbi5iaW5kKHRoaXMpIDogdGhpcy5kZWZhdWx0U29ydENvbXBhcmVGdW5jdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydERpcmVjdGlvbiA9IHRoaXMuZ3JvdXBTb3J0TW9kZSA9PT0gRGF0YVRhYmxlU29ydE1vZGUuQXNjZW5kID8gMSA6IC0xO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuZmlsdGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEsIGIsIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cERhdGEgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGl0ZW0sIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ncm91cEtleXNbZ3JvdXBEYXRhXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKHsgZ3JvdXA6IGdyb3VwRGF0YSwgaXRlbXM6IGdyb3VwSXRlbXMgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBLZXlzW2dyb3VwRGF0YV0gPSBncm91cEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cERhdGFdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cERhdGFdID0gdGhpcy5kZWZhdWx0R3JvdXBUb2dnbGVFeHBhbmRlZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cEtleXNbZ3JvdXBEYXRhXS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGdyb3Vwc1tpXS5ncm91cCxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5TZXQ6IGkgKyAxLFxyXG4gICAgICAgICAgICAgICAgICAgIHNldFNpemU6IGdyb3Vwcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBzW2ldLmdyb3VwXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW2ldLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogY3VycmVudFBvc2l0aW9uSW5TZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplOiBncm91cHNbaV0uaXRlbXMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25JblNldCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuc2hhZG93VHJlZSA9IHsgZGF0YTogbnVsbCwgY2hpbGRyZW46IFtdIH07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFBvc2l0aW9uSW5TZXQgPSAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGUobm9kZSwgMCwgdGhpcy5zaGFkb3dUcmVlLCBjdXJyZW50UG9zaXRpb25JblNldCwgdGhpcy5pdGVtcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbkluU2V0Kys7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJJdGVtID0gPERhdGFUYWJsZVJlbmRlcmVkSXRlbT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCsrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLmZpbHRlcmVkSXRlbXNbaV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuTm9ybWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0OiBbXVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKHJlbmRlckl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMuZmlsdGVyZWRJdGVtcy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4KyssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuTm9ybWFsXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW5kZXJJdGVtcyhwcmV2ZW50U2Nyb2xsaW5nPzogYm9vbGVhbiwgZm9yY2VVcGRhdGU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSAhdGhpcy5pdGVtcztcclxuXHJcbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVJlbmRlckl0ZW1zKCk7XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZXMgaG93IGhpZ2ggdGhlIHNjcm9sbCBkYXRhIGRpdiBzaG91bGQgYmUuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcyAmJiAhdGhpcy5kaXNhYmxlVUlWaXJ0dWFsaXphdGlvbikge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAqIHRoaXMucm93SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIGhlaWdodCBpcyB0b28gbXVjaCwgd2UgbmVlZCB0byBsaW1pdGVkIHRoZSBoZWlnaHQgb3RoZXJ3aXNlIE1pY3Jvc29mdCBFZGdlIHdpbGwgY3Jhc2guXHJcbiAgICAgICAgICAgIC8vIEl0J3Mgb2sgaWYgdGhlIHNjcm9sbCBkYXRhIGRpdiBoZWlnaHQgZG9lc24ndCBlcXVhbCB0byB0aGUgYWN0dWFsIHRvdGFsIGRhdGEgdGFibGUgaGVpZ2h0XHJcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgYW55d2F5IHdlIHVzZSB0aGUgcmF0aW8gb2Ygc2Nyb2xsIGRhdGEgZGl2IGhlaWdodCB0byBhY3R1YWwgdG90YWwgbGlzdCBpdGVtIGhlaWdodFxyXG4gICAgICAgICAgICAvLyB0byBjYWxjdWxhdGUgdGhlIHNjcm9sbGluZyBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGRhdGEuXHJcbiAgICAgICAgICAgIHRoaXMuaGFzTG9uZ0xpc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGhlaWdodCA+IHRoaXMubWF4QWN0dWFsU2Nyb2xsRGF0YUVsZW1lbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZmluZCBhIGhlaWdodCBuZWFyIHRoZSBtYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCB3aGljaCBjYW4gYmUgZGl2aWRlZCBleGFjdGx5IGJ5IHRoZSByb3cgaGVpZ2h0LlxyXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdoZW4gd2UgY2FsY3VhdGUgdGhlIHNjcm9sbGluZyBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGRhdGEsXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgZmxvYXRpbmcgcGFydCBvZiB0aGUgaGVpZ2h0IHdpbGwgaW1wYWN0IHRoZSBhY2N1cmFjeSBvZiB0aGUgY2FsY3VsYXRpb24gcmVzdWx0LlxyXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNMb25nTGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMubWF4QWN0dWFsU2Nyb2xsRGF0YUVsZW1lbnRIZWlnaHQgLyB0aGlzLnJvd0hlaWdodCkgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc29ydEl0ZW1zKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlICYmIHRoaXMuZWRpdGFibGVBdXRvTmV3Um93KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckl0ZW1Gb3JOZXdEYXRhSXRlbSA9IDxEYXRhVGFibGVSZW5kZXJlZEl0ZW0+e1xyXG4gICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiA8RWRpdGFibGVEYXRhSXRlbT57XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1zZnRTbWUubmV3R3VpZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25BbGVydHM6IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5lZGl0YWJsZU5ld0RhdGFJdGVtIHx8IHt9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgaXNOZXdSb3c6IHRydWVcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLk5vcm1hbCxcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IFtdXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaChyZW5kZXJJdGVtRm9yTmV3RGF0YUl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtSW5WaWV3UG9ydChwcmV2ZW50U2Nyb2xsaW5nLCBmb3JjZVVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVTY3JvbGxBYm92ZURhdGFFbGVtZW50KHJlbmRlcmVkSXRlbUFib3ZlVmlld1BvcnRMZW5ndGg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxBYm92ZURhdGFFbGVtZW50ID0gdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIE9ubHkgZGlzcGxheSB0aGUgc2Nyb2xsIGFib3ZlIGRhdGEgZWxlbWVudCB3aGVuIGl0J3MgaGVpZ2h0IGlzIGF2YWlsYWJsZS5cclxuICAgICAgICAvLyBJdHMgaGVpZ2h0IG1heSBub3QgYmUgcmVhZHkgd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyByZW5kZXJlZCBmaXJzdCB0aW1lIGFuZCB0aGUgc2Nyb2xsIHRvcCBpcyAwLlxyXG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ICYmIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCA9IHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbmRlcmVkSXRlbUFib3ZlVmlld1BvcnRMZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gdGhpcy5yb3dIZWlnaHQgKiByZW5kZXJlZEl0ZW1BYm92ZVZpZXdQb3J0TGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YVN0eWxlVG9wID0gdGhpcy5kaXNwbGF5SXRlbXNUb3AgLSB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgKyAncHgnO1xyXG4gICAgICAgICAgICBzY3JvbGxBYm92ZURhdGFFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkxheW91dENoYW5nZWRSZXNwb25zaXZlV2luZG93KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIudXBkYXRlVmlld1BvcnRXaWR0aER5bmFtaWNhbGx5T25QaG9uZURvd24oXHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQsIHRoaXMucmVuZGVyZXIsIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudCwgdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5EYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlci5jaGVja0lzVGFibGVSZW5kZXJlZE9uUGhvbmVEb3duV2l0aE1pbkhlaWdodChcclxuICAgICAgICAgICAgdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQsIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1RhYmxlUmVuZGVyZWRXaXRoTWluSGVpZ2h0UGhvbmVEb3duLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc1RhYmxlUmVuZGVyZWRXaXRoTWluSGVpZ2h0UGhvbmVEb3duLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdpdmUgdGhlIGFjY2VzcyBvZiB0aGlzIGZ1bmN0aW9uIG9uIHNwZWNpYWwgc2l0dWF0aW9uIHdoZXJlIGRpYWxvZyBjb250YWlucyBkYXRhLXRhYmxlXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uV2luZG93QnJlYWtwb2ludENoYW5nZWQoKTtcclxuICAgICAgICB0aGlzLmRlZmVycmVkT25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb24gd2luZG93IGJyZWFrcG9pbnQgY2hhbmdlZCBoYW5kbGVyLlxyXG4gICAgICogQWRkaW5nIHlpZWxkIGZvciBjb21wb25lbnQgdG8gZ2V0IEVsZW1lbnRSZWYgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgKi9cclxuICAgIEBZaWVsZCgpXHJcbiAgICBwcml2YXRlIG9uV2luZG93QnJlYWtwb2ludENoYW5nZWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNjcm9sbEJvZHlFbGVtZW50IHx8ICF0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQgfHwgIXRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkUmVzcG9uc2l2ZVdpbmRvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBZaWVsZCgpXHJcbiAgICBwcml2YXRlIG9uTGF5b3V0Q2hhbmdlZCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB6b29tU2NhbGVIID0gKHdpbmRvdy5zY3JlZW4ud2lkdGggLSB3aW5kb3cuaW5uZXJXaWR0aCkgLyB3aW5kb3cuc2NyZWVuLndpZHRoO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50V2lkdGggPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICBjb25zdCBhZGp1c3RlZFdpZHRoID0gTWF0aC5tYXgoY3VycmVudFdpZHRoICsgem9vbVNjYWxlSCAqIGN1cnJlbnRXaWR0aCwgY3VycmVudFdpZHRoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWN0dWFsQ29sdW1uUHJvY2Vzc2VkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQgPSB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtSW5WaWV3UG9ydChmYWxzZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxhYmxlSG9yaXpvbnRhbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQXMgdGhlIHVzZXIgem9vbXMgaW4gYW5kIG91dCwgd2UgbmVlZCB0byBlbmFibGUgaG9yaXpvbnRhbCBzY3JvbGxpbmcgaW4gdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgLy8gVG8gYWNjb21tb2RhdGUgZGlzcGxheSBvZiBiaWdnZXIgem9vbWVkIGluIHRleHQsIHdlIGFsc28gYWRqdXN0IHRoZSB3aWR0aCBvZiB0aGVcclxuICAgICAgICAgICAgICAgIC8vIGlubmVyIHRhYmxlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyB0ZWNobmlxdWUgd2lsbCBub3Qgd29yayBmb3IgTW96aWxsYSwgd2hvc2UgdmFsdWUgb2Ygd2luZG93LmlubmVyV2lkdGggYW5kIHdpbmRvdy5zY3JlZW4ud2lkdGggcmVtYWluc1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgY29uc3RhbnRcclxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IE5vdCB3aW5kb3cgcmVzcG9uc2l2ZSBkZXNpZ25cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdvdmVyZmxvdy14JywgYGF1dG9gKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLFxyXG4gICAgICAgICAgICAgICAgICAgIGAke2FkanVzdGVkV2lkdGh9cHhgKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICd3aWR0aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgYCR7YWRqdXN0ZWRXaWR0aH1weGApO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV2lkdGggPSB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gV2Ugc3RvcmUgdGhlIG9yaWdpbmFsIHJhdGlvcyBvZiB0aGUgY29sdW1uIHdpZHRocyBhcyBwZXJjZW50YWdlcyBvZiB0aGUgb2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnNcclxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLndpZHRoLmVuZHNXaXRoKCclJykgJiYgIWNvbHVtbi53aWR0aFBlcmNlbnRhZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sV2lkdGggPSBEYXRhVGFibGVDb21wb25lbnQucHhDb252ZXJ0ZXIuY29udmVydFRvUHgoY29sdW1uLndpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBnZXQgcmF0aW9zIGZvciB1bml0cyB0aGF0IHdlIGNhbiBzdWNjZXNzZnVsbHkgY29udmVydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sV2lkdGggJiYgIWlzTmFOKGNvbFdpZHRoKSAmJiBvcmlnaW5hbFdpZHRoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLndpZHRoUGVyY2VudGFnZSA9IGNvbFdpZHRoIC8gb3JpZ2luYWxXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVGhlIHRlbXBsYXRlIGFwcGxpZXMgdGhlIHdpZHRoIHJhdGlvIG9mIGVhY2ggY29sdW1uIG9uIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLndpZHRoUGVyY2VudGFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi53aWR0aCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogY29sdW1uLndpZHRoUGVyY2VudGFnZSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gV2hlbiBsYXlvdXQgaXMgY2hhbmdlZCwgdGhlIFwiZGlzcGxheSBhYm92ZSB2aWV3IHBvcnRcIiBpdGVtIGxpc3QgZGF0YSBzb3VyY2UgaXMgdXBkYXRlZFxyXG4gICAgICAgICAgICAvLyBidXQgdGhlIGh0bWwgaXMgbm90IHVwZGF0ZWQgeWV0LiBTbyB0aGUgVUkgb2YgdGhlIFwiZGlzcGxheSBhYm92ZSB2aWV3IHBvcnRcIiBpcyBub3QgZ29vZC5cclxuICAgICAgICAgICAgLy8gU28gaGlkZSB0aGUgVUkgZm9yIG5vdyBhbmQgYWRqdXN0IGl0IGluIHNldFRpbWVvdXQuXHJcbiAgICAgICAgICAgIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbEFib3ZlRGF0YUVsZW1lbnQoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHJpdmF0ZSBkZWZlcnJlZE9uTGF5b3V0Q2hhbmdlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24obm9kZTogVHJlZU5vZGVEYXRhSXRlbSwgc2VsZWN0ZWQ6IGJvb2xlYW4sIHNraXBFdmVudD86IGJvb2xlYW4sIHNraXBMaW5rU2VsZWN0aW9uPzogYm9vbGVhbixcclxuICAgICAgICBpdGVtc1RvU2VsZWN0PzogVHJlZU5vZGVEYXRhSXRlbVtdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGl0ZW1zVG9TZWxlY3QpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQgPSBpdGVtc1RvU2VsZWN0LmluZGV4T2Yobm9kZS5kYXRhKSAhPT0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUgfHxcclxuICAgICAgICAgICAgKHNraXBMaW5rU2VsZWN0aW9uIHx8ICFub2RlLmNoaWxkcmVuIHx8ICFub2RlLmNoaWxkcmVuLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc3BsaWNlKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihub2RlKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBpZiAoIXNraXBMaW5rU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzaG91bGRTZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudE5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZS5jaGlsZHJlbltpXS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5zZWxlY3RlZCA9IHNob3VsZFNlbGVjdDtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoKCFza2lwTGlua1NlbGVjdGlvbiB8fCBpdGVtc1RvU2VsZWN0KSAmJiBub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGROb2RlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLnBhcmVudCA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY2hpbGROb2RlLCBzZWxlY3RlZCwgc2tpcEV2ZW50LCBza2lwTGlua1NlbGVjdGlvbiwgaXRlbXNUb1NlbGVjdCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFsaWduQ29udGVudCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IHRoaXMuaGVhZGVyVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHJ5IHRvIGZvY3VzIG9uIHJvdyBmdW5jdGlvbjsgaWYgdGhlcmUgYXJlIG5vIHJlY29yZHMsIHRoZSBubyByZWNvcmRzIG1lc3NhZ2UgaXMgc2VsZWN0ZWRcclxuICAgICAqIEBwYXJhbSBpbmRleCBPbmx5IHBhc3MgaW4gaW5kZXggaWYgbmVlZHMgZm9jdXMgb25seVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNTZWxlY3RlZFJvdyhpbmRleD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJlZEl0ZW1zIHx8ICF0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3dUaW1lcik7XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3dUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcm93OiBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKCFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKGluZGV4KSAmJiBpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByb3cgPSB0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvcihgLnNtZS10YWJsZS1yb3cuc21lLXRhYmxlLXJvdy1kYXRhW2RhdGEtcmVuZGVyZWQtaXRlbS1pbmRleD1cIiR7aW5kZXh9XCJdYCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChyb3cpKSB7XHJcbiAgICAgICAgICAgICAgICByb3cgPSB0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNtZS10YWJsZS1yb3cuc21lLXRhYmxlLXJvdy1kYXRhLnNtZS10YWJsZS1yb3ctYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyVG9wID0gMDtcclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lckJvdHRvbSA9IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudFJlY3QgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRDbGllbnRSZWN0cygpWzBdO1xyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyQ2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyVG9wID0gY29udGFpbmVyQ2xpZW50UmVjdC50b3A7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJCb3R0b20gPSBjb250YWluZXJDbGllbnRSZWN0LmJvdHRvbTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGlzUm93SW5WaWV3UG9ydCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcm93VG9wID0gMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0NsaWVudFJlY3QgPSByb3cuZ2V0Q2xpZW50UmVjdHMoKVswXTtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dDbGllbnRSZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93VG9wID0gcm93Q2xpZW50UmVjdC50b3A7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaXNSb3dJblZpZXdQb3J0ID0gcm93VG9wID49IGNvbnRhaW5lclRvcCAmJiByb3dUb3AgPCBjb250YWluZXJCb3R0b207XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJvdyAmJiAhaXNSb3dJblZpZXdQb3J0ICYmIGluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3RlZCByb3cgaXMgbm90IGluIHZpZXdwb3J0LCBqdXN0IGZvY3VzIHRoZSBmaXJzdCB2aXNpYmxlIHJvdyBpbiB0aGUgdmlld3BvcnQuXHJcbiAgICAgICAgICAgICAgICAvLyBUaGVuIGRhdGEgdGFibGUgd2lsbCBzdGlsbCBiZSBhYmxlIHRvIHJlY2VpdmUga2V5Ym9hcmQgZXZlbnQuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYWNrdXBSb3dzID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YScpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYWNrdXBSb3dzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0NsaWVudFJlY3QgPSBiYWNrdXBSb3dzW2ldLmdldENsaWVudFJlY3RzKClbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0NsaWVudFJlY3QudG9wID4gY29udGFpbmVyVG9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IGJhY2t1cFJvd3NbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID49IDAgJiYgIXRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gPEhUTUxFbGVtZW50PnJvdy5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXRkJylbdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnRdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnQgPSBEb20uZ2V0Rmlyc3RGb2N1c2FibGVEZXNjZW5kZW50KGNlbGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBlZGl0YWJsZSBkYXRhIHRhYmxlLCBiZWNhdXNlIG9mIHRoZSBkZXNpZ25cclxuICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgZm9jdXMgb24gdGhlIHJvdyBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c2FibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdy5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRWxlbWVudEZvY3VzaW5nKGV2ZW50OiBFbGVtZW50Rm9jdXNpbmdFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC50YXJnZXRab25lID09PSB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRBcmVhSGFzRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Rm9jdXNCZWhhdmlvcigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHRFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgodGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudGFyZ2V0RWxlbWVudCAmJiBldmVudC50YXJnZXRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1zbWUtbGFzdC1mb2N1c2FibGUtc2hhZG93LWVsZW1lbnQnKVxyXG4gICAgICAgICAgICAmJiBldmVudC50YXJnZXRFbGVtZW50ID09PSB0aGlzLmxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHRGb2N1c0JlaGF2aW9yKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlWm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IGV2ZW50LnNvdXJjZVpvbmUgPT09IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Rm9jdXNhYmxlRWxlbWVudCA9IERvbS5nZXROZXh0Wm9uZUVsZW1lbnQoZXZlbnQudGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRGb2N1c2FibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c09uY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsVGFyZ2V0Wm9uZSA9IERvbS5nZXRBbmNlc3RvclpvbmUobmV4dEZvY3VzYWJsZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIENvcmVFbnZpcm9ubWVudC5hY2Nlc3NpYmlsaXR5TWFuYWdlci5wcm9jZXNzRWxlbWVudEZvY3VzaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5uYXRpdmVFdmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEZvY3VzYWJsZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldFpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFRhcmdldFpvbmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHRFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgodGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci52ZXJpZnlEYXRhVGFibGVDb2x1bW5zVmlvbGF0aW9uKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ29sdW1ucygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NBY3R1YWxDb2x1bW5zKCk7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1uc01haW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NDb2x1bW5zTWFpbigpIHtcclxuICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWNvbGNvdW50JyxcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmxlbmd0aCArICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5NdWx0aXBsZSA/IDEgOiAwKSk7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgICAgICB0aGlzLmFjdHVhbENvbHVtblByb2Nlc3NlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzQWN0dWFsQ29sdW1ucygpIHtcclxuICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKHNvdXJjZUNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlQ29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFzb3VyY2VDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLnB1c2goc291cmNlQ29sdW1uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNzQ29sdW1uc0J5T3JkZXIob3JkZXI6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbHVtbnNPcmRlciA9IG9yZGVyO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgICAgICAgb3JkZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4uZmllbGQgPT09IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlQ29sdW1uICYmIHNvdXJjZUNvbHVtbiAhPT0gdGhpcy5ncm91cENvbHVtbiAmJiAhc291cmNlQ29sdW1uLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5wdXNoKHNvdXJjZUNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zTWFpbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBmaWx0ZXJlZCBpdGVtcyAoaWYgYW55KSB3aXRoaW4gdGhlIGRhdGFUYWJsZS5cclxuICAgICAqIEByZXR1cm5zIG51bWJlciBvZiBkYXRhVGFibGUgZmlsdGVyZWQgaXRlbXMsIHplcm8gaWYgbm9uZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE51bWJlck9mRmlsdGVyZWRJdGVtcygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMgPyB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIDogMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdG9vbHRpcCBoYW5kbGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGRhdGEgdGFibGUgY29sdW1uLlxyXG4gICAgICogQHBhcmFtIGNvbHVtbiAgICAgICAgQ29sdW1uIGZvciB0b29sdGlwIGhhbmRsZXJcclxuICAgICAqIEBwYXJhbSByZW5kZXJlZEl0ZW0gIERhdGEgaXRlbSBmb3IgdGhlIHJvd1xyXG4gICAgICogQHJldHVybnMgICAgICAgICAgICAgVG9vbHRpcCBzdHJpbmcgaWYgZXhpc3RzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQsIHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoISFjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcihyZW5kZXJlZEl0ZW0uZGF0YSwgY29sdW1uLmZpZWxkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZW5hYmxlRGVmYXVsdFRvb2x0aXBzICYmICFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKGNvbHVtbi5maWVsZCkpXHJcbiAgICAgICAgICAgICAgICA/IGNvbHVtbi5nZXREZWZhdWx0VG9vbHRpcEhhbmRsZXIocmVuZGVyZWRJdGVtLmRhdGEsIGNvbHVtbi5maWVsZCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCBmcm9tIHVwZ3JhZGluZyBkYXRhIHRhYmxlIHRvIHN1cHBvcnQgZWRpdGFibGUgZGF0YSB0YWJsZVxyXG4gICAgICogVGhlIGlkZWEgaXMgdG8gdXNlIHRoZSBkYXRhIHRhYmxlJ3MgaGVhZGVyIHdpZHRoIHRvIGJlIGFwcGxpZWQgb24gdGhlIGRhdGEgdGFibGUgYm9keSBjb2x1bW5zLlxyXG4gICAgICogV2hlbiBub3Qgc2hvd2luZyBoZWFkZXJzLCBuZWVkIHRvIHVzZSB0aGUgaGVhZGVyJ3Mgd2lkdGggdG8gYmUgYXBwbGllZCB0byB0ZCBhcyB3ZWxsLlxyXG4gICAgICovXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGhFbGVtZW50cyA9IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtY2FwdGlvbi5zbWUtdGFibGUtY29sdW1uLWhlYWRlcicpO1xyXG4gICAgICAgIGlmICh0aEVsZW1lbnRzICYmIHRoRWxlbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWN0dWFsQ29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zW2ldLmRvbVdpZHRoID0gdGhFbGVtZW50c1tpXS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldElzQ29sdW1uV2lkdGhDYWxjdWxhdGVkKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBnaXZlcyBvbmUgbW9yZSB0aWNrIHNvIHRoYXQgdGhlIGxvYWRpbmcgd2hlZWwgY2FuIHN0YW5kIG9uZSBtb3JlIGh0bWwgcmVuZGVyaW5nIGxpZmUgY3ljbGVcclxuICAgICAqIFRoaXMgZml4ZXMgYSBidWcgcmVsYXRlZCB0byBkYXRhIHRhYmxlIG9uIGxvYWQgbWlzLWFsaWduZWRcclxuICAgICAqIEBwYXJhbSBpbnB1dCBib29sZWFuXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwcml2YXRlIHNldElzQ29sdW1uV2lkdGhDYWxjdWxhdGVkKGlucHV0OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5pc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCA9IGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlID09PSB0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YS5jb250ZW50ID09PSB0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VHJlZU5vZGVEYXRhSWRlbnRpdHkobm9kZTogVHJlZU5vZGVEYXRhSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihjdXJyZW50Tm9kZS5kYXRhKSArICdcXFxcJyArIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VsZWN0QWxsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5yZW5kZXJlZEl0ZW1zLnNsaWNlKCkubWFwKGl0ZW0gPT4gaXRlbS5kYXRhKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcHBseVF1ZXJ5RWRpdG9yKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDogUXVlcnlEYXRhKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFF1ZXJ5RWRpdG9yID0gdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0O1xyXG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHF1ZXJ5RWRpdG9yRmlsdGVyTWFpbih2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSwgaXRlbTogRGF0YVRhYmxlRGF0YUl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5RWRpdG9ySXRlbSA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50c1tpXTtcclxuICAgICAgICAgICAgaWYgKGZvdW5kICYmIHRoaXMuYWN0dWFsQ29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBxdWVyeUVkaXRvckl0ZW0uY29sdW1uLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5hY3R1YWxDb2x1bW5zLmZpbHRlcigoY29sKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbC5maWVsZCA9PT0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9KVswXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGl0ZW0sIGNvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4uZmlsdGVyT3ZlcnJpZGluZ0Z1bmN0aW9uKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FzZVNlbnNpdGl2ZUZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0RmxvYXRWYWwgPSBwYXJzZUZsb2F0KHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbEZsb2F0VmFsID0gcGFyc2VGbG9hdCh2YWx1ZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0U3RyaW5nVmFsID0gcXVlcnlFZGl0b3JJdGVtLnZhbHVlLnZhbHVlLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsU3RyaW5nVmFsID0gdmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlFZGl0b3JJdGVtICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocXVlcnlFZGl0b3JJdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuU2luZ2xlRHJvcGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBxdWVyeUVkaXRvckl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5UZXh0SW5wdXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHF1ZXJ5RWRpdG9ySXRlbS5vcGVyYW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRdWVyeURhdGFPcGVyYW5kLkVxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnF1ZXJ5RWRpdG9yRXF1YWxJc0NvbnRhaW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTdHJpbmdWYWwuaW5kZXhPZih0YXJnZXRTdHJpbmdWYWwpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBmaWx0ZXIgc3RyaW5nIGlzIGVtcHR5IHRoZW4gdHJlYXQgYXMgJ0VxdWFsSXNDb250YWluJyB0byByZWZyZXNoIGRhdGEgdGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTdHJpbmdWYWwgIT09IHRhcmdldFN0cmluZ1ZhbCAmJiAhTXNmdFNtZS5pc0VtcHR5KHRhcmdldFN0cmluZ1ZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlEYXRhT3BlcmFuZC5HdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0YXJnZXRGbG9hdFZhbCB8fCB0YXJnZXRGbG9hdFZhbCA9PT0gMCkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3R1YWxGbG9hdFZhbCB8fCBhY3R1YWxGbG9hdFZhbCA9PT0gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhcmdldEZsb2F0VmFsIDw9IGFjdHVhbEZsb2F0VmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRdWVyeURhdGFPcGVyYW5kLkx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRhcmdldEZsb2F0VmFsIHx8IHRhcmdldEZsb2F0VmFsID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGFjdHVhbEZsb2F0VmFsIHx8IGFjdHVhbEZsb2F0VmFsID09PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFyZ2V0RmxvYXRWYWwgPj0gYWN0dWFsRmxvYXRWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5RGF0YU9wZXJhbmQuTnE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGFjdHVhbFN0cmluZ1ZhbCAhPT0gdGFyZ2V0U3RyaW5nVmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGVxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTdHJpbmdWYWwuaW5kZXhPZih0YXJnZXRTdHJpbmdWYWwpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWVyeUVkaXRvckl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5NdWx0aVNlbGVjdERyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMucXVlcnlFZGl0b3JGaWx0ZXJCeU11bHRpcGxlU2VsZWN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QsIHF1ZXJ5RWRpdG9ySXRlbSwgYWN0dWFsU3RyaW5nVmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWVyeUVkaXRvckl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5UaW1lc3BhbkRyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMucXVlcnlFZGl0b3JGaWx0ZXJCeVRpbWVzcGFuRHJvcGRvd24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCwgcXVlcnlFZGl0b3JJdGVtLCBhY3R1YWxTdHJpbmdWYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcXVlcnlFZGl0b3JGaWx0ZXJCeVRpbWVzcGFuRHJvcGRvd24oXHJcbiAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0OiBRdWVyeURhdGEsIHF1ZXJ5RWRpdG9ySXRlbTogUXVlcnlEYXRhSXRlbSwgYWN0dWFsU3RyaW5nVmFsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHF1ZXJ5RWRpdG9ySXRlbS5jb2x1bW4udmFsdWU7XHJcbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gICAgICAgIGxvb3AxOlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5UaW1lc3BhbkRyb3Bkb3duICYmIGl0ZW0uY29sdW1uICYmIGl0ZW0uY29sdW1uLnZhbHVlID09PSBmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUudmFsdWUgJiYgaXRlbS52YWx1ZS52YWx1ZS5zdGFydCAmJiBpdGVtLnZhbHVlLnZhbHVlLmVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaXRlbS52YWx1ZS52YWx1ZS5zdGFydC5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gaXRlbS52YWx1ZS52YWx1ZS5lbmQuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbCA9IG5ldyBEYXRlKGFjdHVhbFN0cmluZ1ZhbCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8PSBhY3R1YWwgJiYgYWN0dWFsIDw9IGVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHF1ZXJ5RWRpdG9yRmlsdGVyQnlNdWx0aXBsZVNlbGVjdGlvbihcclxuICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSwgcXVlcnlFZGl0b3JJdGVtOiBRdWVyeURhdGFJdGVtLCBhY3R1YWxTdHJpbmdWYWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHF1ZXJ5RWRpdG9ySXRlbS5jb2x1bW4udmFsdWU7XHJcbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gICAgICAgIGxvb3AxOlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5NdWx0aVNlbGVjdERyb3Bkb3duICYmIGl0ZW0uY29sdW1uICYmIGl0ZW0uY29sdW1uLnZhbHVlID09PSBmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpdGVtLnZhbHVlLnZhbHVlLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0U3RyaW5nVmFsID0gaXRlbS52YWx1ZS52YWx1ZVtqXS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFN0cmluZ1ZhbCA9PT0gdGFyZ2V0U3RyaW5nVmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3AxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhhbmRsZXIgZm9yIGNvbGxhcHNpbmcsIGNoZWNraW5nIGlmIG5vZGUxIGNvbnRhaW5zIG5vZGUyLlxyXG4gICAgICogQHBhcmFtIG5vZGUxIHRoZSBub2RlIGFzIHJvb3QgdG8gY2hlY2sgaWYgaXQgY29udGFpbnMgbm9kZTIuXHJcbiAgICAgKiBAcGFyYW0gbm9kZTIgdGhlIG5vZGUgdG8gYmUgY2hlY2tlZCBpZiBjaGlsZHJlbiBvZiBub2RlMS5cclxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZTEgY29udGFpbnMgbm9kZTIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJlZVRhYmxlQ29sbGFwc2VIYW5kbGVyKG5vZGUxOiBhbnksIG5vZGUyOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIW5vZGUxIHx8ICFub2RlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBpdCBpcyBhIHBhcmVudCBub2RlLCBpdCBjYW4gYmUgd2l0aG91dCBpZC5cclxuICAgICAgICBpZiAobm9kZTEuZGF0YT8uaWQgPT09IG5vZGUyLmRhdGE/LmlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG5vZGUxPy5jaGlsZHJlbiAmJiBub2RlMS5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlMS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHJlZVRhYmxlQ29sbGFwc2VIYW5kbGVyKGNoaWxkLCBub2RlMikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgaWRCYWcgdXNlZCBieSB0aGlzIGNvbXBvbmVudCB0byBzdG9yZSB1bmlxdWUgZWxlbWVudCBpZHMuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmaXJzdERhdGFDb2x1bW46ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZSB0cmVlIGdyaWQgYWNjZXNzaWJpbGl0eSBkb2N1bWVudGF0aW9uczogaHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL0FjY2Vzc2liaWxpdHkvVHJlZUdyaWRcclxuICovXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLXRyZWUtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBEYXRhVGFibGVDb21wb25lbnQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdUcmVlVGFibGVDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5zaG93QXNUcmVlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXRJbml0aWFsSG9zdENsYXNzZXMoKS5jb25jYXQoW1xyXG4gICAgICAgICAgICAnc21lLXRyZWUtdGFibGUnXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiByb2xlPVwicHJlc2VudGF0aW9uXCIgY2xhc3M9XCJzbWUtdGFibGUtaGVhZGVyIHNtZS1mb2N1cy16b25lIHNtZS1kYXRhLXRhYmxlLXRyYW5zaXRpb25cIiAjaGVhZGVyXHJcbiAgW2NsYXNzLnNtZS1zaGFkb3ctc2Nyb2xsZWQtY29udGVudF09XCJpc1Njcm9sbGVkRG93blwiIFtjbGFzcy5zbWUtdGFibGUtbXVsdGktc2VsZWN0XT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLXNlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiIFtjbGFzcy5zbWUtdGFibGUtaW5kZW50ZWRdPVwiIW5vTGVmdE1hcmdpblwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1zZWxlY3QtYWxsLWVuYWJsZWRdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgc2hvd0FsbEl0ZW1DaGVja2JveFwiPlxyXG4gIDwhLS0gQWNjb3JkaW5nIHRvIHRoZSBhY2Nlc3NpYmlsaXR5IHRlYW0sIGRhdGEtdGFibGUgaGVhZGVycyBzaG91bGQgYmUgYWNjZXNzaWJsZSBieSBrZXlib2FyZFxyXG4gIGFuZCB0aGUgcmVzaXplciBzaG91bGQgYWxzbyBiZSBhY2Nlc3NlZCBieSBrZXlib2FyZC4tLT5cclxuICA8ZGl2ICNoZWFkZXJUYWJsZSBjbGFzcz1cInNtZS10YWJsZSBzbWUtdGFibGUtdmlydHVhbGl6ZWQgc21lLXRhYmxlLWF1dG8td2lkdGgtcGhvbmUtZG93blwiIHJvbGU9XCJyb3dncm91cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1yb3cgc21lLWFycmFuZ2Utc3RhY2staCBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCIgcm9sZT1cInJvd1wiXHJcbiAgICAgIChrZXlkb3duKT1cIm9uSGVhZGVyVGFibGVQcmVzc2VkKCRldmVudClcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jYXB0aW9uXCIgW2F0dHIucm9sZV09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJz8nY29sdW1uaGVhZGVyJzoncHJlc2VudGF0aW9uJ1wiXHJcbiAgICAgICAgZGF0YS11dGEtaWQ9XCJjaGVja2JveENvbHVtblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3ggc21lLXRhYmxlLWhlYWRlci1jaGVja2JveFwiXHJcbiAgICAgICAgICAqbmdJZj1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnICYmIHNob3dBbGxJdGVtQ2hlY2tib3ggJiYgc2hvd0hlYWRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgIDxpbnB1dCBzbWUtbGludC1kaXNhYmxlLXNlbGYgdHlwZT1cImNoZWNrYm94XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRBbGxJdGVtQ2hlY2tCb3hBcmlhTGFiZWwoKVwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJzaG91bGRBbGxJdGVtQ2hlY2tCb3hDaGVja2VkKCk/J3RydWUnOidmYWxzZSdcIiAoY2hhbmdlKT1cIm9uQWxsSXRlbUNoZWNrQm94Q2xpY2tlZCgpXCIgLz5cclxuICAgICAgICAgIDxsYWJlbCByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBhY3R1YWxDb2x1bW5zOyBsZXQgY29sSW5kZXggPSBpbmRleFwiIFthdHRyLmZpZWxkXT1cImNvbHVtbi5maWVsZFwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGNvbHVtbi53aWR0aH1cIlxyXG4gICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNhcHRpb24gc21lLXRhYmxlLWNvbHVtbi1oZWFkZXIgc21lLXBvc2l0aW9uLWZsZXgtYXV0byB7e2NvbHVtbi5zdHlsZUNsYXNzfX1cIlxyXG4gICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIiBbYXR0ci5kYXRhLXV0YS1pZF09XCJjb2x1bW4udXRhSWRcIiBbYXR0ci5jb2x1bW4taW5kZXhdPVwiY29sSW5kZXhcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSE9J2ZhbHNlJyAmJiBzaG93SGVhZGVyXCJcclxuICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWhlYWRlci1jZWxsIHNtZS1mb2N1cy16b25lXCIgKGNsaWNrKT1cImNsaWNrQ29sdW1uKGNvbHVtbilcIiByb2xlPVwiY29sdW1uaGVhZGVyXCJcclxuICAgICAgICAgIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCIgYXJpYS1saXZlPVwicG9saXRlXCIgdGFiaW5kZXg9XCIwXCIgW2F0dHIuYXJpYS1zb3J0XT1cImNvbHVtblNvcnRTZXR0aW5nc1tjb2x1bW4uaGVhZGVyXVwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbHVtbi5zb3J0YWJsZSA/IGdldFNvcnRMYWJlbChjb2x1bW4pIDogbnVsbFwiPlxyXG4gICAgICAgICAgPHNwYW4+e3tjb2x1bW4uaGVhZGVyfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1tYXJnaW4tbGVmdC14eHNcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLXVwJzpjb2x1bW4uc29ydE1vZGU9PT1zb3J0TW9kZUVudW0uQXNjZW5kLCdzbWUtaWNvbi1kb3duJzpjb2x1bW4uc29ydE1vZGU9PT1zb3J0TW9kZUVudW0uRGVzY2VuZH1cIj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIShjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRhYmxlIT0nZmFsc2UnKSAmJiBzaG93SGVhZGVyXCJcclxuICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWhlYWRlci1jZWxsIHNtZS1mb2N1cy16b25lXCIgcm9sZT1cImNvbHVtbmhlYWRlclwiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCIgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sdW1uLnNvcnRhYmxlID8gZ2V0U29ydExhYmVsKGNvbHVtbikgOiBudWxsXCI+XHJcbiAgICAgICAgICA8c3Bhbj57e2NvbHVtbi5oZWFkZXJ9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLW1hcmdpbi1sZWZ0LXh4c1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tdXAnOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5Bc2NlbmQsJ3NtZS1pY29uLWRvd24nOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5EZXNjZW5kfVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dIZWFkZXJcIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbFwiIHJvbGU9XCJjb2x1bW5oZWFkZXJcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c21lLXJlc2l6ZXIgW2ZvY3VzYWJsZV09XCJmYWxzZVwiICpuZ0lmPVwiY29sSW5kZXghPT1hY3R1YWxDb2x1bW5zLmxlbmd0aC0xICYmIHNob3dIZWFkZXJcIlxyXG4gICAgICAgICAgcmVzaXplckhvc3RTZWxlY3Rvcj1cImRpdi5zbWUtdGFibGUtaGVhZGVyXCIgKHJlc2l6ZWQpPVwib25Db2x1bW5SZXNpemVkKGNvbEluZGV4LCAkZXZlbnQpXCJcclxuICAgICAgICAgIFt2aXNpYmxlVG9TY3JlZW5SZWFkZXJdPVwidHJ1ZVwiIFtzaG93UmVzaXplckNvdmVyXT1cImZhbHNlXCIgb3JpZW50YXRpb249XCJsZWZ0XCJcclxuICAgICAgICAgIChyZXNpemluZyk9XCJvbkNvbHVtblJlc2l6aW5nKCRldmVudClcIiBjbGFzcz1cInNtZS1mb2N1cy16b25lXCI+PC9zbWUtcmVzaXplcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJzbWUtZm9jdXMtem9uZSBzbWUtdGFibGUtY29udGFpbmVyIHNtZS1kYXRhLXRhYmxlLXRyYW5zaXRpb25cIiAjY29udGVudCByb2xlPVwicHJlc2VudGF0aW9uXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLW11bHRpLXNlbGVjdF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJ1wiIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCJcclxuICBbY2xhc3Muc21lLW1hcmdpbi10b3Atbm9uZV09XCIhc2hvd0hlYWRlclwiIFtjbGFzcy5zbWUtdGFibGUtaW5kZW50ZWRdPVwiIW5vTGVmdE1hcmdpblwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1ncmlkLWxpbmVzXT1cInNob3dHcmlkXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLXNlbGVjdC1hbGwtZW5hYmxlZF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiBzaG93QWxsSXRlbUNoZWNrYm94XCJcclxuICBbY2xhc3Muc21lLXRhYmxlLWVkaXRhYmxlXT1cImVkaXRhYmxlXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1zY3JvbGwtY29udGFpbmVyIHNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLWluc2V0LW5vbmVcIlxyXG4gICAgW25nQ2xhc3NdPVwieydzbWUtbGF5b3V0LWFic29sdXRlIHNtZS1wb3NpdGlvbi1pbnNldC1ub25lJzogc2Nyb2xsYWJsZSwgJ3NtZS1zY3JvbGxhYmxlJzogc2hvdWxkU2Nyb2xsfVwiXHJcbiAgICAjc2Nyb2xsQ29udGFpbmVyIHJvbGU9XCJyb3dncm91cFwiPlxyXG4gICAgPGRpdiByb2xlPVwicm93XCIgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS10YWJsZS1yb3ctcGxhY2Vob2xkZXJcIiAjZW1wdHlNZXNzYWdlIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICpuZ0lmPVwic2hvd05vUmVjb3Jkc01lc3NhZ2UoKVwiIGRhdGEtdXRhLWlkPVwiZW1wdHktdGFibGUtbWVzc2FnZVwiPlxyXG4gICAgICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJpc0xvYWRpbmcgfHwgIWlzQ29sdW1uV2lkdGhDYWxjdWxhdGVkXCIgW21lc3NhZ2VdPVwibG9hZGluZ01lc3NhZ2VcIj5cclxuICAgICAgPC9zbWUtbG9hZGluZy13aGVlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jZWxsLXBsYWNlaG9sZGVyXCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgIDxkaXYgcm9sZT1cImdyaWRjZWxsXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiPnt7Z2V0Tm9SZWNvcmRzTWVzc2FnZSgpfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtcmVsYXRpdmUgc21lLXBvc2l0aW9uLXN0cmV0Y2gtaCBzbWUtYXJyYW5nZS1vdmVyZmxvdy1oaWRlXCIgI3Njcm9sbEJvZHkgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlIHNtZS10YWJsZS1zY3JvbGxhYmxlIHNtZS10YWJsZS12aXJ0dWFsaXplZFwiICNzY3JvbGxBYm92ZURhdGFcclxuICAgICAgICBbbmdTdHlsZV09XCJ7dG9wOiBzY3JvbGxBYm92ZURhdGFTdHlsZVRvcH1cIiBbYXR0ci5hcmlhLWhpZGRlbl09XCJ0cnVlXCIgc21lLWxpbnQtZGlzYWJsZT5cclxuICAgICAgICA8IS0tIEFib3ZlIHZpZXcgcG9ydCAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByZW5kZXJlZEl0ZW0gb2YgcmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQ7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLXJvdyBzbWUtdGFibGUtcm93LWRhdGEgc21lLXRhYmxlLXJvdy1zZWxlY3RhYmxlXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LWFjdGl2ZV09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPT09IGdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KClcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1yb3ctc2VsZWN0ZWRdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIHx8IGlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1pdGVtXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1oZWFkZXJdPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0FzVHJlZVwiIGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGFjdHVhbENvbHVtbnM7IGxldCBjb2xJbmRleD1pbmRleFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtdGFibGUtY29sdW1uLWZpcnN0JzogaXNGaXJzdERhdGFDb2x1bW4oY29sdW1uKSwgJ3NtZS10YWJsZS1ncm91cC1oZWFkZXItY2VsbCc6IHJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJ9XCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzpjb2x1bW4uZG9tV2lkdGgrJ3B4J31cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG8ge3tjb2x1bW4uc3R5bGVDbGFzc319XCJcclxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc1RyZWVUYWJsZVBhcmVudE5vZGUocmVuZGVyZWRJdGVtKSA/IC0xIDogMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlciBzbWUtc2NyZWVuLXJlYWRlci1kaXNhYmxlLWNvcHlcIiAqbmdJZj1cImlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgIHt7Z2V0QWRkaXRpb25hbFNjcmVlblJlY29yZGVyQ29udGVudChyZW5kZXJlZEl0ZW0pfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiBjb2xJbmRleD09PTBcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0dyb3VwVG9nZ2xlKHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlR3JvdXBUb2dnbGVcIiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzIHNtZS1tYXJnaW4tcmlnaHQteHhzXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6aXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKSwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IWlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSl9XCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YX19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyIFt0ZW1wbGF0ZV09XCJ0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWV4cGFuZGFibGUnOiByZW5kZXJlZEl0ZW0uaGFzQ2hpbGRyZW4gJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzTGVhZn1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHNcIiByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZD8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja1RyZWVUb2dnbGUoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6cmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQsICdzbWUtaWNvbi1jaGV2cm9uUmlnaHQnOiFyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZH1cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmNvbGxhcHNlIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmV4cGFuZFwiPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiByZW5kZXJlZEl0ZW0ubm9kZS5pc0J1c3kgJiYgY29sSW5kZXg9PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGxcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6KHJlbmRlcmVkSXRlbS5kZXB0aCoxNis0KSsncHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNtZS1sb2FkaW5nLXdoZWVsIHNpemU9XCJleHRyYS1zbWFsbFwiIFtpbmxpbmVdPVwidHJ1ZVwiIFtpc0JhY2tncm91bmRUcmFuc3BhcmVudF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dBc1RyZWUgJiYgc2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgcmVuZGVyZWRJdGVtLnR5cGU9PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIGNvbEluZGV4PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSXRlbUNoZWNrQm94Q2xpY2tlZChyZW5kZXJlZEl0ZW0pXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhP3Jlc29sdmVPYmplY3RQYXRoKHJlbmRlcmVkSXRlbS5kYXRhLGNvbHVtbi5maWVsZCk6Jy4nfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtaGVpZ2h0LWF1dG9dPVwiYXV0b1Jvd0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5VGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZSBzbWUtdGFibGUtc2Nyb2xsYWJsZVwiICNzY3JvbGxEYXRhIFtjbGFzcy5zbWUtdGFibGUtdmlydHVhbGl6ZWRdPVwiIWRpc2FibGVVSVZpcnR1YWxpemF0aW9uXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7dG9wOiBzY3JvbGxEYXRhU3R5bGVUb3B9XCIgc21lLWxpbnQtZGlzYWJsZSByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmVuZGVyZWRJdGVtIG9mIHJlbmRlcmVkSXRlbXNJbkFuZEJlbG93Vmlld1BvcnQ7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgIChrZXlkb3duKT1cIm9uQ29udGVudFRhYmxlUHJlc3NlZCgkZXZlbnQpXCIgKGtleXVwKT1cIm9uQ29udGVudFRhYmxlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoY29udGV4dG1lbnUpPVwiZW5hYmxlUmlnaHRDbGlja1NlbGVjdCA/IHNlbGVjdEl0ZW0oJGV2ZW50LCByZW5kZXJlZEl0ZW0pIDogdHJ1ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SXRlbSgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIiBjbGFzcz1cInNtZS10YWJsZS1yb3cgc21lLXRhYmxlLXJvdy1kYXRhIHNtZS10YWJsZS1yb3ctc2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLXJvdy1hY3RpdmVdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LXNlbGVjdGVkXT1cInJvd0Rpc3BsYXlBc1NlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1pdGVtXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1oZWFkZXJdPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCIgW2NsYXNzLnNtZS10YWJsZS1yb3ctZWRpdGFibGVdPVwiZWRpdGFibGVcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS1oYXMtdmFsaWRhdGlvbi1lcnJvcl09XCJoYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLWRhdGEtdGFibGUtcm93LW5ldy1pdGVtXT1cInJlbmRlcmVkSXRlbT8uZGF0YT8uaXNOZXdSb3dcIlxyXG4gICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwicmVuZGVyZWRJdGVtLmluZGV4ID49IDAgPyAwIDogdW5kZWZpbmVkXCIgKGRibGNsaWNrKT1cImRvdWJsZUNsaWNrUm93KCRldmVudCxyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIChmb2N1cyk9XCJvbkNvbnRlbnRJdGVtRm9jdXNlZCgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIiAoZm9jdXNpbik9XCJvbkNvbnRlbnRJdGVtRm9jdXNlZCgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uQ29udGVudEl0ZW1CbHVycmVkKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiIFthdHRyLmRhdGEtcmVuZGVyZWQtaXRlbS1pbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXhcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXgrMlwiIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKT8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRIb3ZlcmVkUmVuZGVyZWRJdGVtKHJlbmRlcmVkSXRlbSlcIiAobW91c2VsZWF2ZSk9XCJ1bnNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJnZXRBcmlhRXhwYW5kZWRBdHRyaWJ1dGVWYWx1ZShyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGV2ZWxdPVwic2hvd0FzVHJlZSAmJiByZW5kZXJlZEl0ZW0uZGVwdGggPyAocmVuZGVyZWRJdGVtLmRlcHRoKzEpOnVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLWhcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJzZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnID8gJ2dyaWRjZWxsJzogJ3ByZXNlbnRhdGlvbidcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dBc1RyZWVcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jaGVja2JveC1jb250YWluZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1mdWxsLWhlaWdodF09XCJhdXRvUm93SGVpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSk/J3RydWUnOidmYWxzZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIiAoY2hhbmdlKT1cIm9uSXRlbUNoZWNrQm94Q2xpY2tlZChyZW5kZXJlZEl0ZW0pXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgYWN0dWFsQ29sdW1uczsgbGV0IGNvbEluZGV4PWluZGV4XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS10YWJsZS1jb2x1bW4tZmlyc3QnOiBpc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pLCAnc21lLXRhYmxlLWdyb3VwLWhlYWRlci1jZWxsJzogcmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlcn1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOmNvbHVtbi5kb21XaWR0aCsncHgnfVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0byB7e2NvbHVtbi5zdHlsZUNsYXNzfX1cIiByb2xlPVwiZ3JpZGNlbGxcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcm93aW5kZXhdPVwicmVuZGVyZWRJdGVtLmluZGV4KzJcIlxyXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzVHJlZVRhYmxlUGFyZW50Tm9kZShyZW5kZXJlZEl0ZW0pID8gLTEgOiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1zY3JlZW4tcmVhZGVyIHNtZS1zY3JlZW4tcmVhZGVyLWRpc2FibGUtY29weVwiICpuZ0lmPVwiaXNGaXJzdERhdGFDb2x1bW4oY29sdW1uKVwiPlxyXG4gICAgICAgICAgICAgICAge3tnZXRBZGRpdGlvbmFsU2NyZWVuUmVjb3JkZXJDb250ZW50KHJlbmRlcmVkSXRlbSl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIGNvbEluZGV4PT09MFwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrR3JvdXBUb2dnbGUocmVuZGVyZWRJdGVtKVwiIFtpZF09XCJnZXRGaXJzdENvbHVtbklkKGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VHcm91cFRvZ2dsZVwiIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHMgc21lLW1hcmdpbi1yaWdodC14eHNcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLWNoZXZyb25Eb3duJzppc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpLCAnc21lLWljb24tY2hldnJvblJpZ2h0JzohaXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKX1cIj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgW3RlbXBsYXRlXT1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNCdXN5ICYmIGNvbEluZGV4PT09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOihyZW5kZXJlZEl0ZW0uZGVwdGgqMTYrNCkrJ3B4J31cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtZXhwYW5kYWJsZSc6IHJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbiAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNMZWFmfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zaXplLXh4c1wiIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkPyd0cnVlJzonZmFsc2UnXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrVHJlZVRvZ2dsZSgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLWNoZXZyb25Eb3duJzpyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IXJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkfVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuY29sbGFwc2UgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuZXhwYW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIHJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8c21lLWxvYWRpbmctd2hlZWwgc2l6ZT1cImV4dHJhLXNtYWxsXCIgW2lubGluZV09XCJ0cnVlXCIgW2lzQmFja2dyb3VuZFRyYW5zcGFyZW50XT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0FzVHJlZSAmJiBzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiByZW5kZXJlZEl0ZW0udHlwZT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgY29sSW5kZXg9PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbCBzbWUtdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pPyd0cnVlJzonZmFsc2UnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaWRCYWcuZmlyc3REYXRhQ29sdW1uICsgcmVuZGVyZWRJdGVtLmluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCIgKGNoYW5nZSk9XCJvbkl0ZW1DaGVja0JveENsaWNrZWQocmVuZGVyZWRJdGVtKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGFibGVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmJvZHlUZW1wbGF0ZSAmJiByZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCIgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIiBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEsY29sdW1uLmZpZWxkKTonLid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1oZWlnaHQtYXV0b109XCJhdXRvUm93SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIiBbaWRdPVwiZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4uYm9keVRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGFcIiBbcm93SW5kZXhdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgIWNvbHVtbi5ib2R5RWRpdFRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCxjb2x1bW4uZmllbGQpOicuJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiIFtyZW5kZXJlZEl0ZW1dPVwicmVuZGVyZWRJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlSZWFkVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50XCIgW3Jvd0luZGV4XT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIGNvbHVtbi5ib2R5RWRpdFRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3VsZFNob3dFZGl0Um93KHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZSAmJiByZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YT9yZXNvbHZlT2JqZWN0UGF0aChyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50LGNvbHVtbi5maWVsZCk6Jy4nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCIgW3RpdGxlXT1cImdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGEuY29udGVudFwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3VsZFNob3dFZGl0Um93KHJlbmRlcmVkSXRlbSlcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1lZGl0LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5RWRpdFRlbXBsYXRlXCIgW2ZpZWxkXT1cImNvbHVtbi5maWVsZFwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleFwiIFtyZW5kZXJlZEl0ZW1dPVwicmVuZGVyZWRJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsaWRhdGlvbkFsZXJ0KT1cIm9uVmFsaWRhdGlvbkFsZXJ0SGFuZGxlcihyZW5kZXJlZEl0ZW0sIGNvbHVtbi5maWVsZCwgJGV2ZW50LmFsZXJ0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGRhdGFDaGFuZ2VkKT1cIm9uRWRpdGFibGVEYXRhQ2hhbmdlZCgkZXZlbnQucmVuZGVyZWRJdGVtLCRldmVudC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtKVwiIGNsYXNzPVwic21lLXRhYmxlLXJvdy12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJzZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnID8gJ2dyaWRjZWxsJyA6ICdwcmVzZW50YXRpb24nXCJcclxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJz8nMCc6J3VuZGVmaW5lZCdcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2YWxpZGF0aW9uUmVzdWx0SXRlbSBvZiByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLXZhbGlkYXRpb24tYWxlcnQgW2FsZXJ0XT1cInZhbGlkYXRpb25SZXN1bHRJdGVtLmFsZXJ0XCI+PC9zbWUtdmFsaWRhdGlvbi1hbGVydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtcm93XCIgI3RlbXBSb3c+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXRkXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiPiZuYnNwOzwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvdWxkVXNlTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRcIiAjbGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQgY2xhc3M9XCJzbWUtZm9jdXMtem9uZVwiXHJcbiAgICAgIGRhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50IChmb2N1cyk9XCJvbkxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNlZCgkZXZlbnQpXCIgdGFiaW5kZXg9XCIwXCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLWluc2V0LW5vbmVcIlxyXG4gICAgKm5nSWY9XCJpc0J1c3kgfHwgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrICYmIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmlzUnVubmluZylcIj5cclxuICAgIDxzbWUtbG9hZGluZy13aGVlbCBbaXNCYWNrZ3JvdW5kVHJhbnNwYXJlbnRdPVwidHJ1ZVwiPjwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2ICNyZXNpemVySW5kaWNhdG9yXHJcbiAgY2xhc3M9XCJzbWUtd2lkdGgteHhzIHNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLXN0cmV0Y2gtdiBzbWUtYmFja2dyb3VuZC1jb2xvci1iYXNlLTgwIHNtZS1sYXllci1mbHlvdXQgc21lLWxheW91dC1ub25lXCI+XHJcbjwvZGl2PlxyXG4iXX0=
|